Вот простое доказательство концепции с использованием потоков / коллекторов:
public static void main(String[] args)
{
List<String> arrList = new ArrayList<String>();
String sentence = "the Black lion was bigger than the red lion";
var words = sentence.split("\\s");
// take all the words
var sortedByLength = Arrays.stream(words)
// group by string length
.collect(Collectors.groupingBy(String::length,
// sort by string length
TreeMap::new,
// unique words
Collectors.toSet()));
// for every length-List(word) pair
for(var entry : sortedByLength.entrySet())
{
// for every word in List(word)
for(var word : entry.getValue())
{
System.out.print(word+" ");
}
System.out.print(entry.getKey()+" ");
}
}
Вывод:
the red was 3 than lion 4 Black 5 bigger 6
Вам придется расширить его, чтобы читать ввод как вам угодно.
Вот аналогичное подтверждение концепции, не использующее списки, Tree (set / map) s или Regex:
public static void main(String[] args)
{
String sentence = "the Black lion was bigger than the red lion";
var words = sentence.split("\\s");
if(words.length == 0)
return;
int nulls = 0;
for(int i = 0; i < words.length; i++)
{
for(int j = i+1; j < words.length; j++)
{
if(words[i].equals(words[j]))
{
words[i] = null;
nulls++;
break;
}
}
}
var noDupes = new String[words.length - nulls];
int index = 0;
for(int i = 0; i < words.length; i++)
{
if(words[i] != null)
noDupes[index++] = words[i];
}
Arrays.sort(noDupes, Comparator.comparingInt(String::length));
for(int i = 0; i < noDupes.length; i++)
{
System.out.print(noDupes[i]+" ");
if(i == noDupes.length - 1)
{
System.out.println(noDupes[i].length());
}
else if(noDupes[i+1].length() > noDupes[i].length())
{
System.out.print(noDupes[i].length()+" ");
}
}
}
Вывод:
was the red 3 than lion 4 Black 5 bigger 6
Это, вероятно, в значительной степени неэффективнопо сравнению с первым решением, но оно работает.