比较两个HashMaps键是否相等?

时间:2013-08-05 19:05:45

标签: java generics data-structures collections compareto

根据Key,我想要比较两个HashMap<HashSet<String>, Long>。密钥是HashSet<String>,我可能需要更改为TreeSet<String>,但我认为没有必要。我该如何比较这些?

注意:Map仅用作单个Set的包装。

for(HashMap<HashSet<String>, Long> entry : ListOfMaps) {
    if(entry.keySet().equals(entry2.keySet())) {
        // do something
    }
}

我想查看Set1.equals(Set2)。

该集合必须完全相同。由于每个Set<String>中只有一个HashMap<Set<String>, Long>,因此我抓住所有密钥让我感到紧张,或者这样可以吗?

1 个答案:

答案 0 :(得分:1)

Set的equals()契约说:

  

如果给定对象也是一个集合,则返回true,两个集合具有相同的大小,并且给定集合的每个成员都包含在此集合中。这可以确保equals方法在Set接口的不同实现中正常工作。

因此,只要Set实现遵循合同,您的代码就会起作用。

但是,这可能很危险,具体取决于您的代码对用作键的集合的作用。一旦一个对象被用作Map中的一个键,它就不应该改变,因为这会破坏Map的契约。

Map<Set<String>, T> map = HashMap<>();
Set<String> mySet = new HashSet<>();

mySet.add("first");
map.put(mySet, myValue);


Set<String> copyOfMySet = new HashSet<>(mySet);

//returns true
map.contains(copyOfMySet);

//modifying mySet
mySet.remove("first");

//this will now return false
map.contains(copyOfMySet);