从 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);
完成 forEach
或 toCollection(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);
我正在努力使我的应用达到最佳性能。在代码中的某个时刻,我想从映射中检索除对应于特定键的值之外的所有值。
现在,如果我想检索所有值,我会使用这个:
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);
完成 forEach
或 toCollection(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);