Java 比较两个HashMaps键是否相等?
我有两个Java 比较两个HashMaps键是否相等?,java,generics,data-structures,collections,compareto,Java,Generics,Data Structures,Collections,Compareto,我有两个HashMap,我想根据键进行比较。关键是一个HashSet,我可能需要更改为TreeSet,但我认为没有必要。我如何比较这些 注意:映射仅用作单个集合的包装器 for(HashMap<HashSet<String>, Long> entry : ListOfMaps) { if(entry.keySet().equals(entry2.keySet())) { // do something } } for(HashMap条目:
HashMap
,我想根据键进行比较。关键是一个HashSet
,我可能需要更改为TreeSet
,但我认为没有必要。我如何比较这些
注意:映射仅用作单个集合的包装器
for(HashMap<HashSet<String>, Long> entry : ListOfMaps) {
if(entry.keySet().equals(entry2.keySet())) {
// do something
}
}
for(HashMap条目:listofmap){
if(entry.keySet().equals(entry2.keySet())){
//做点什么
}
}
我想检查Set1.equals(Set2)
集合必须完全相同。由于每个HashMap
中只有一个Set
,因此抓取所有键会让我感到紧张,还是这样可以?Set的equals()契约说:
如果给定对象也是一个集合,两个集合的大小相同,并且给定集合的每个成员都包含在此集合中,则返回true。这确保equals方法在Set接口的不同实现中正常工作
因此,只要集合实现遵循契约,代码就可以工作
但是,这可能是危险的,这取决于代码对用作键的集合所做的操作。一旦一个对象被用作映射中的键,它就不应该改变,因为这破坏了映射的契约
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);
Map-Map=HashMap();
Set mySet=newhashset();
mySet.add(“第一”);
map.put(mySet,myValue);
Set copyOfMySet=新哈希集(mySet);
//返回true
map.contains(copyOfMySet);
//修改mySet
mySet.remove(“第一”);
//现在将返回false
map.contains(copyOfMySet);
根据javadoc Cool的说法,您在那里得到的应该是有效的,只是确保每个集合中只有一个集合。请注意,hashset
不是有序的,因此,.equals()
调用将确保第一个集合中的所有字符串也出现在第二个集合中。但是它会检查每个HashSet中的所有字符串,以确保它们相等,或者只是比较顺序。Set[A,B,C]会等于Set[B,C,A]对吗?我只是使用映射作为集合和时间戳的包装。一般来说,我个人避免使用集合、列表等作为映射的键,因为很容易破坏东西。。。正如这篇评论的作者所指出的:)如果可能的话,最好使用简单的变量,如int、string等。不使用set here或任何集合的另一个原因可能是这个相等操作的复杂性。如果您使用任何字符串或int作为键,那么比较两个哈希映射将是O(nm),其中n是键长度,m是键数。现在如果您使用hashset,那么它将是O(nm*pq),其中p是Set的密钥长度,q是密钥数。如果我在这里遗漏了什么,请告诉我你的观点。