【发布时间】:2016-11-07 16:33:37
【问题描述】:
我在输入上有 10 个集合,其中每个集合包含数百个项目(字符串)。
我想要什么:
我想查找至少由两个集合共享的项目,并按在不同集合中出现的次数以降序对它们进行排序。
我的做法:
我创建了以下代码。但是,我想知道,是否存在更有效的方法来做到这一点......
Map<String, Integer> sharedCounts = new HashMap<>();
for (int i = 0; i < 10; i++) {
Set<String> words = getWords(i);
for (String word : words) {
if (sharedCounts.containsKey(word)) {
sharedCounts.put(word, commons.get(word) + 1);
} else {
sharedCounts.put(word, 1);
}
}
}
Map<String, Integer> sorted = sharedCounts.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
【问题讨论】:
-
看起来不错。 Map 的
put和containsKey具有O(1)时间复杂度,否则您对所有单词的所有集合仅迭代一次,给出O(n)其中n是所有集合中单词的总数。最慢的部分实际上是排序,因为这将是O(nlogn)。 -
顺便说一句,我刚刚意识到一件事-您的
sharedCounts地图与sorted地图有何不同?它们都是哈希映射,这意味着无序。整个排序是多余的。不想收藏上榜吗?或者也许是树状图,但让 count 成为 key 和 word 成为 value? -
是的,您必须生成树状图。我刚试过,它按字母顺序排序,不管哪个单词出现次数更多。
-
为什么在放地图之前要排序?
-
变量
sharedCounts和commons有什么区别?那些应该是同一个对象吗?