【发布时间】:2023-03-28 23:27:01
【问题描述】:
我正在尝试删除 HashMap 中除了指定的键集之外的所有条目。 例如,HashMap numToalphaMap 具有条目 1-->a、2-->b、3-->c、4-->d。给定 KeySet 是 {1, 2}。我想从 numToalphaMap 中删除其他条目,即 (3-->c, 4-->d)。谁能帮我解决这个问题?
【问题讨论】:
我正在尝试删除 HashMap 中除了指定的键集之外的所有条目。 例如,HashMap numToalphaMap 具有条目 1-->a、2-->b、3-->c、4-->d。给定 KeySet 是 {1, 2}。我想从 numToalphaMap 中删除其他条目,即 (3-->c, 4-->d)。谁能帮我解决这个问题?
【问题讨论】:
最简单的方法(在 Java 8 中)是删除任何不在 keySet 中的键:
map.keySet().removeIf(k -> !keySet.contains(k));
【讨论】:
如果你使用的是 Java 8,下面的流解决方案怎么样?
Set<Integer> keysToKeep = new HashSet<>();
keysToKeep.add(1);
keysToKeep.add(2);
Map<Integer, String> intToStringMap = new HashMap<>();
intToStringMap.put(1, "a");
intToStringMap.put(2, "b");
intToStringMap.put(3, "c");
intToStringMap.put(4, "d");
Map<Integer, String> filteredMap =
intToStringMap.entrySet().stream()
.filter(x -> keysToKeep.contains(x.getKey()))
.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
Java 7 版本:
Iterator<Map.Entry<Integer, String>> entryIterator = intToStringMap.entrySet().iterator();
while (entryIterator.hasNext()) {
Map.Entry<Integer, String> entry = entryIterator.next();
if(!keysToKeep.contains(entry.getKey())) {
entryIterator.remove();
}
}
【讨论】:
出于性能考虑,您可以先确定您可以保留的密钥集是大还是小。如果它很小,您可以创建一个新的 HashMap 并在该新映射中分配键值对。否则,您可以迭代并删除那些不在集合中的内容,如下所示:
for (Map.Entry<String, String> entry : map.entrySet()) {
if (keySet.contains(entry.getKey())) {
entry.remove();
}
}
【讨论】: