我有以下代码:
List<Pattern> patterns = Lists.newArrayList(Pattern.compile("blah"), Pattern.compile("blah2"));
Map<Pattern, String> map = new HashMap<Patter, String>();
map.put(patterns.get(0), "1");
map.put(patterns.get(1), "2");
Assert.assertTrue(map.containsKey(patterns.get(0)));
断言失败!
为什么会这样?首先,我很惊讶Pattern
类没有根据模式实现equals
和hashCode
。但即使它没有,也不Object
使用hashCode
和equals
的内存地址,这样只要我传递相同的Object
实例,应该找到钥匙?
编辑:抱歉,伙计们。这是我实际拥有的。忘记transform
每次访问完成后都会创建一个新实例。
List<Pattern> patterns = Lists.transform(Lists.newArrayList("blah1", "blah2"), toPattern);
答案 0 :(得分:6)
鉴于您的代码无法编译,我只能假设这不是您正在运行的代码。
List<Pattern> patterns = Arrays.asList(Pattern.compile("blah"), Pattern.compile("blah2"));
Map<Pattern, String> map = new HashMap<Pattern, String>();
map.put(patterns.get(0), "1");
map.put(patterns.get(1), "2");
System.out.println(map.containsKey(patterns.get(0)));
打印
true
答案 1 :(得分:1)
即使对象没有正确的hashCode / equals,您仍然可以使用地图和集合。相反,几乎总是可以使用TreeMap和自定义比较器:
final Map<Pattern, String> map = new TreeMap<Pattern, String>(
new Comparator<Pattern>()
{
@Override
public int compare(final Pattern o1, final Pattern o2)
{
return o2.pattern().compareTo(o2.pattern());
}
});
这里唯一的问题 - 表达正则表达式的真正平等是相当困难的。例如。 regexp“a | b”与“b | a”完全相同。但也许字符串比较对你来说已经足够了。
另一种方法是使用所需的hashCode / equals将Pattern包装在类中,并将其用作哈希映射的键。