0

我有两个HashMap<HashSet<String>, Long>要根据 Key 进行比较。关键是 a 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>所以我很紧张我要抓住所有的钥匙,或者这样可以吗?

4

1 回答 1

1

Set 的 equals() 合约说:

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

因此,只要 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);
于 2013-08-05T19:19:40.063 回答