Map <pattern,object =“”>无法找到键</pattern,>

时间:2011-10-05 11:50:49

标签: java hashmap hashcode

我有以下代码:

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类没有根据模式实现equalshashCode。但即使它没有,也不Object使用hashCodeequals的内存地址,这样只要我传递相同的Object实例,应该找到钥匙?

编辑:抱歉,伙计们。这是我实际拥有的。忘记transform每次访问完成后都会创建一个新实例。

List<Pattern> patterns = Lists.transform(Lists.newArrayList("blah1", "blah2"), toPattern);

2 个答案:

答案 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包装在类中,并将其用作哈希映射的键。