Java:检查Key是否包含在两个HashMap中

时间:2017-04-11 09:08:33

标签: java search hashmap key

有没有办法搜索并获取两个HashMap个对象中包含的密钥子集?

到目前为止,我总是从一个hashmap进行迭代,然后在第二个中查找匹配。

我只是想知道是否有更聪明的方法来进行这种比较。

5 个答案:

答案 0 :(得分:1)

怎么样

List<String> listOne = new ArrayList<String>(mapOne.keySet());
List<String> listTwo = new ArrayList<String>(mapTwo.keySet());

List<String> listThree = new ArrayList<String>(listTwo);
listThree.retainAll(listOne);

或者 Commons Collections

CollectionUtils.intersection(java.util.Collection a, java.util.Collection b)

答案 1 :(得分:0)

在低于O(N)的复杂度中无法做到这一点。你唯一能做的就是迭代最小的hashmap。 您可以做的另一件事是使用哈希图的键集并使用方法retainAll,它为您执行交集,但复杂性不会改变。

答案 2 :(得分:0)

使用HashSet。如果你的用例需要有(key,value)对,那么维护一个HashMap和HashSet,每当在HashMap中插入一个键时,也将它插入HashSet中。否则,只需维护一个HashSet。

然后你可以使用retainAll()函数来找到两组的交集。

HashSet intersection = hashSet1.retainAll(hashSet2);

时间复杂度将为O(n)摊销。这与您正在做的几乎相同,但这会使您的代码更清晰,更易读。

请注意,您可以维护List而不是Set,并调用list的retainAll()方法。但是,List的retainAll()将以O(n ^ 2)复杂度运行,因为List的contains()方法在O(n)中运行,而HashSet的contains()以O(1)分摊运行。

答案 3 :(得分:0)

您可以使用newMap删除所有密钥来创建removeAll,如下所示inlin评论:

Map<String, String> map1 = new HashMap<>();
Map<String, String> map2 = new HashMap<>();
Set<Entry<String, String>> set1 = map1.entrySet();//get the entries from Map1
set1.removeAll(map2.entrySet());/remove all matched entries mateched in map2

Map<String, String> newMap = set1.stream().//convert set1 to Map using stream
    collect(Collectors.toMap(Entry::getKey, Entry::getValue));

此示例使用Map<String, String>,但可以应用于任何类型(当然,对于自定义类,您需要覆盖equals()中的hashcode()java.lang.Object方法。

答案 4 :(得分:0)

可能不是最有效的方法,但这个Java 8单行程序

Map<Integer,Integer> mapA = ..... // your first map
Map<Integer,Integer> mapB = ..... // your second map
List<Integer> keys = mapA.entrySet().stream().filter((v) -> mapB.containsKey(v.getKey()))
                         .map(v -> v.getKey()).collect(Collectors.toList());