ストリームはここで動作します。
// I'm assuming you can get the input from somewhere
// maybe a scanner
String input = "The user 539537g is coolio8fsd";
// Split on any non-letter
String[] words = input.split("[^A-z]");
Map<Long, Long> wordCounts =
Arrays.stream(words) // Stream the words
.filter(s -> !s.isEmpty()) // Filter out the empty ones
.map(String::length) // Map each string to its length
.collect(Collectors.groupingBy(i->i, Collectors.counting()); // Create a map with length as key and count as value
System.out.println("There are " + wordCounts.size() + " words.");
wordCounts.forEach((k,v) -> System.out.println(v + " " + k + "-letter words"));
私はこれを1行で行いましたが、読みやすさは低下しました。これは良いバランスのようです。
出力を「2 3文字の単語」にすることはできますか? – bradimus
この種の出力が必要な場合は、すべての数値の大きなマップを検討してください。それ以外の場合は、@bradimusの質問を、文字列の番号付けのために 'Strings'の代わりに' Integers'を使用するべきであるというアドバイスとして取ることができます。 –