картане может найти ключ - PullRequest
       4

картане может найти ключ

1 голос
/ 05 октября 2011

У меня есть следующий код:

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);

Ответы [ 2 ]

6 голосов
/ 05 октября 2011

Поскольку ваш код не компилируется, я могу только предположить, что это не тот код, который вы используете.

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 голос
/ 05 октября 2011

Вы все еще можете использовать карты и наборы, даже если у объектов нет надлежащего 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());
    }
});

Единственная проблема здесь - довольно сложно выразить истинное равенство регулярных выражений. Например. регулярное выражение "a | b" в точности совпадает с "b | a". Но, возможно, вам достаточно сравнения строк.

Еще один способ - обернуть Pattern в вашем классе желаемым hashCode / equals и использовать его в качестве ключа хэш-карты.

...