Содержит список пар - PullRequest
       0

Содержит список пар

8 голосов
/ 10 февраля 2011
  List<Pair<String, String> > lp = new ArrayList<Pair<String, String> >();
  lp.add(new Pair("1", "2"));

Как проверить, содержит ли список lp 1 и 2, т.е. пару («1», «2»).

Ответы [ 2 ]

7 голосов
/ 10 февраля 2011

Ваш класс Pair должен реализовать equals() и hashCode(), и все готово. List.contains() реализован в виде метода equals() типа. См. API для List.contains(). (Немного отредактировано, чтобы ответить на комментарии @maaartinus, чей ответ вы должны прочитать, потому что наблюдения твердые, и мне немного смешно складывать их здесь. Как отмечает Мааартин, наилучшей практикой здесь было бы избегайте подверженных ошибкам ручных определений для equals и hashcode и вместо этого используйте вспомогательные функции Guava для nullable equals и hashCode для n объектов ).

final class Pair<T> {

   final T left;
   final T right;

   public Pair(T left, T right)
   {
     if (left == null || right == null) { 
       throw new IllegalArgumentException("left and right must be non-null!");
     }
     this.left = left;
     this.right = right;
   }

   public boolean equals(Object o)
   {
     // see @maaartinus answer
     if (! (o instanceof Pair)) { return false; }
     Pair p = (Pair)o;
     return left.equals(p.left) && right.equals(p.right);
   } 

   public int hashCode()
   {
      return 7 * left.hashCode() + 13 * right.hashCode();
   } 
}

С подходящим equals() теперь вы можете сделать:

  lp.add(new Pair("1", "2"));
  assert lp.contains(new Pair("1","2"));

Отвечая на комментарии ниже, возможно, было бы хорошо включить хорошую ссылку для «Почему мне нужно реализовать hashCode()

1 голос
/ 10 февраля 2011

Реализация в ответ by andersoj

 return left != null && right != null && left.equals(p.left) && right.equals(p.right);

неверно: нулевые тесты ясно показывают, что нулевое значение является допустимым значением для левых и правых. Таким образом, есть как минимум две проблемы:

  • new Pair(null, null).hashCode() бросков NPE
  • new Pair(null, null) НЕ равно себе!

Посмотрите на Объекты класса Guava для правильной реализации. Используйте его или напишите статические вспомогательные методы, такие как

public static boolean equal(Object a, Object b) {
    return a==b || a!=null && a.equals(b);
}
public static int hashCode(Object a) {
    return a==null ? 0 : a.hashCode();
}

и всегда используйте их.

Никогда не пишите equals, содержащий нулевой тест.

Это легко взорвать, и никто не заметил этого. Используя Помощника, легко понять это правильно:

public boolean equals(Object o)  {
    if (!(o instanceof Pair)) return false;
    Pair p = (Pair) o;
    return Helper.equals(left, p.left) && Helper.equals(right, p.right);
} 

public int hashCode() {
    return 7 * Helper.hashCode(left) + 13 * Helper.hashCode(right);
} 

Конечно, запрещение нулей в конструкторе тоже возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...