我正在为n-puzzle实现几个解算器(BFS和A*)。我使用HashSet来维护封闭列表,因为contains方法有O(1)时间。
我的HashSet是一组HashMaps (从整数到整数),所以我想看看HashSet是否包含指定的映射。如果HashSet的名称是set
,而HashMap的名称是map
,那么是否可以这样写:
set.contains(map);
检查map
的键和值是否都与集合中映射的键和值匹配?
如果不是,那么根据映射列表检查map
的值的最快方法是什么?
我也试过创建一个地图列表,然后使用地图的equals方法来比较列表中的每个地图,但随着封闭列表的大小增加,它似乎太慢了。
发布于 2018-09-23 04:32:04
是的,您可以使用contains()
查看给定的Map
对象是否在您拥有的Set
中。contains()
方法将使用equals()
方法比较对象,HashMap
的equals()
方法为defined as follow
将指定的对象与此映射进行相等比较。如果给定对象也是映射,并且两个映射表示相同的映射,则返回
true
。更正式地说,如果为m1.entrySet().equals(m2.entrySet())
,则两个映射m1
和m2
表示相同的映射。这确保了equals方法在Map
接口的不同实现中正常工作。
请参考以下示例源代码:
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
Set<Map<Integer, Integer>> sets = new HashSet<Map<Integer, Integer>>();
Map<Integer, Integer> m1 = new HashMap<Integer, Integer>();
m1.put(1, 4);
m1.put(2, 3);
sets.add(m1);
Map<Integer, Integer> m2 = new HashMap<Integer, Integer>();
m2.put(1, 4);
m2.put(6, 7);
sets.add(m2);
System.out.println(sets);
Map<Integer, Integer> m3 = new HashMap<Integer, Integer>();
System.out.println(m3+" | "+sets.contains(m3));
m3.put(6, 7);
System.out.println(m3+" | "+sets.contains(m3));
m3.put(1, 4);
System.out.println(m3+" | "+sets.contains(m3));
}
}
这将生成以下输出:
[{1=4, 2=3}, {1=4, 6=7}]
{} | false
{6=7} | false
{1=4, 6=7} | true
您可以看到,在最后,contains()
方法将返回true
,因为它与Set
中现有的Map
对象相匹配。
https://stackoverflow.com/questions/52460375
复制相似问题