我正在尝试为我的应用程序实现最佳性能。在代码中的某个时刻,我想从地图中检索除了与特定键对应的值之外的所有值。
现在,如果我想要检索所有值,我将使用它:
map.values();
并假设TreeMap类是有效创建的,'values()'方法只是返回一个refference所以 - > O(1)。
在我的情况下,虽然我想排除特定键的值。这段代码:
Set<String> set = new ...
for (String key: map.keySet()) {
if (!key.equals("badKey")) {
set.add(map.get(key));
}
}
的复杂度为N *(logN),比初始的O(1)要慢得多,这是因为只需要删除一个值。
有更好的方法吗?
答案 0 :(得分:2)
您可以使用entrySet
代替keySet
。这样,需要O(1)来确定给定值是否属于您要排除的键。
您可以在需要迭代值时调用entrySet
,并在迭代错误时排除错误密钥。这会给你带来与迭代values()
集合所带来的相同的复杂性。
答案 1 :(得分:2)
这个怎么样?
map.entrySet().stream()
.filter(e -> !e.getKey().equals(keyToFilter))
.map(Map.Entry::getValue);
使用forEach
或toCollection(Collectors.TO_SET)
完成,或只是返回流。
很抱歉,如果代码没有完全编译,那就是内存,而且几个月内我还没有触及java 8 API,但你应该得到漂移。 ;)
答案 2 :(得分:1)
您可以从map.values()
创建集合,然后从此集合中删除“badKey”值。
Set<String> set = new HashSet<String>(map.values());
String badValue = map.get("badKey");
set.remove(badValue);