これはひどく非効率的です。
可能な各長さの値をループしてから、使用可能な各単語をループする代わりに、ドキュメント内の使用可能な単語をループして、それらの長さを数えるのはどうですか?
例えば:
Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>();
for(int i=0; i<list.size(); i++) {
String thisWord = list.get(i);
Integer theLength = (Integer)(thisWord.length());
if(frequencies.containsKey(theLength) {
frequencies.put(theLength, new Integer(frequencies.get(theLength).intValue()+1));
}
else {
frequencies.put(theLength, new Integer(1));
}
}
次に、キーがに存在しない場合、HashMap
その長さの単語がドキュメントに存在しないことがわかります。キーが存在する場合は、発生した回数を正確に調べることができます。
注:このコード例のいくつかの側面は、ボクシングとアンボクシングに関する追加の混乱を防ぐために作成されました。少しすっきりと書くことは可能ですが、実稼働環境では確かにそうします。また、単語の最小または最大の長さについての知識がないことを前提としています(したがって、わずかに柔軟性があり、スケーラブルで、キャッチオールです)。それ以外の場合は、プリミティブ配列を宣言するための他の手法も同様に機能します(Jon Skeetの回答を参照)。
自動ボクシングを利用するよりクリーンなバージョンの場合:
Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>();
for(int i=0; i<list.size(); i++) {
String thisWord = list.get(i);
if(frequencies.containsKey(thisWord.length()) {
frequencies.put(thisWord.length(), frequencies.get(thisWord.length())+1);
}
else {
frequencies.put(thisWord.length(), 1);
}
}