从TreeMap中排除特定值的有效方法

时间:2015-02-15 12:22:08

标签: java data-structures treemap

我正在尝试为我的应用程序实现最佳性能。在代码中的某个时刻,我想从地图中检索除了与特定键对应的值之外的所有值。

现在,如果我想要检索所有值,我将使用它:

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)要慢得多,这是因为只需要删除一个值。


有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用entrySet代替keySet。这样,需要O(1)来确定给定值是否属于您要排除的键。

您可以在需要迭代值时调用entrySet,并在迭代错误时排除错误密钥。这会给你带来与迭代values()集合所带来的相同的复杂性。

答案 1 :(得分:2)

这个怎么样?

map.entrySet().stream()
  .filter(e -> !e.getKey().equals(keyToFilter))
  .map(Map.Entry::getValue);

使用forEachtoCollection(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);