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

Efficient way to exclude a specific value from a TreeMap

我正在努力使我的应用达到最佳性能。在代码中的某个时刻,我想从映射中检索除对应于特定键的值之外的所有值。

现在,如果我想检索所有值,我会使用这个:

map.values();

并假设 TreeMap class 被有效地创建,'values()' 方法只是返回一个引用所以 --> O(1).

在我的例子中,虽然我想排除特定键的值。此代码:

Set<String> set = new ...
for (String key: map.keySet()) {
   if (!key.equals("badKey")) {
      set.add(map.get(key));
   }
}

复杂度为 N*(logN),比最初的 O(1) 慢得多,这是因为只需要删除一个值。


有更好的方法吗?

您可以使用 entrySet 而不是 keySet。这样,找出给定值是否属于您希望排除的键将花费 O(1)。

您可以在需要迭代值时随时调用 entrySet,并在迭代时排除坏键。这会给您带来与遍历 values() 集合相同的复杂性。

这个怎么样?

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

完成 forEachtoCollection(Collectors.TO_SET),或者只是 return 流。

抱歉,如果代码没有完全编译,它来自内存,而且我已经几个月没有触及 java 8 个 API,但你应该明白了。 ;)

您可以从 map.values() 创建集合,然后从该集合中删除 "badKey" 值。

Set<String> set = new HashSet<String>(map.values());
String badValue = map.get("badKey");
set.remove(badValue);