Еще один подход, который вы можете рассмотреть, - подумать об этом по-другому: действительно ли Карта является правильным концептуальным объектом здесь?Можно подумать, что это хорошее использование структуры данных, которой так много пренебрегают в Java, bag .Сумка похожа на set , но позволяет предмету быть в наборе несколько раз.Это значительно упрощает «добавление найденного слова».
Google's guava-library предоставляет структуру Bag, хотя там она называется Multiset
.Используя Multiset, вы можете просто вызвать .add()
один раз для каждого слова, даже если оно уже там.Еще проще, однако, вы можете выбросить свою петлю:
Multiset<String> words = HashMultiset.create(theText);
Теперь у вас есть мультисеть, что вы делаете?Ну, вы можете позвонить entrySet()
, что даст вам набор Multimap.Entry
объектов.Затем вы можете вставить их в List
(они входят в Set
) и отсортировать их, используя Comparator
.Полный код может выглядеть так (используя несколько других необычных функций Guava, чтобы показать их):
Multiset<String> words = HashMultiset.create(theWords);
List<Multiset.Entry<String>> wordCounts = Lists.newArrayList(words.entrySet());
Collections.sort(wordCounts, new Comparator<Multiset.Entry<String>>() {
public int compare(Multiset.Entry<String> left, Multiset.Entry<String> right) {
// Note reversal of 'right' and 'left' to get descending order
return right.getCount().compareTo(left.getCount());
}
});
// wordCounts now contains all the words, sorted by count descending
// Take the first 50 entries (alternative: use a loop; this is simple because
// it copes easily with < 50 elements)
Iterable<Multiset.Entry<String>> first50 = Iterables.limit(wordCounts, 50);
// Guava-ey alternative: use a Function and Iterables.transform, but in this case
// the 'manual' way is probably simpler:
for (Multiset.Entry<String> entry : first50) {
wordArray.add(entry.getElement());
}
и все готово!