HashSet в Java - Сравнение и хэш-ключи - PullRequest
0 голосов
/ 24 марта 2012

Я знаю, что метод HashSet.contains () использует метод .equals для проверки равенства, так как в нем проверяется указатель, чтобы увидеть, равны ли они.

Мне нужно, чтобы проверить фактический объект вуказатель на равенство - в моем конкретном случае мне нужно посмотреть, существует ли уже открытый узел (массив int []) в HashSet.Это очень важно для моего алгоритма поиска, так что реализация моего двунаправленного итеративного углубленного поиска не столь наивна.

Я бы по-прежнему хотел бы линейное время поиска, если это возможно, или, возможно, мне следует использовать другой класс?

Спасибо за вашу помощь.

Ответы [ 3 ]

5 голосов
/ 24 марта 2012

Ссылочное равенство - просто реализация по умолчанию .equals (). Вы можете поместить свои массивы в класс-оболочку, который переопределяет equals и hashCode для проверки содержимого. Примечание: для того, чтобы это работало, содержимое не должно изменяться после помещения их в набор.

import java.util.Arrays;

public class IntArrayNode {

private int[] array;

public IntArrayNode(int[] array) {
  this.array = array;
}

//getter and setter

public boolean equals(Object obj) {
  if (obj != null && obj instanceof IntArrayNode) {
    return Arrays.equals(this.array, ((IntArrayNode) obj).array);
  } else {
    return false;
  }
}

public int hashCode() {
  return Arrays.hashCode(this.array);
}
}
0 голосов
/ 24 марта 2012

Самый простой обходной путь будет Collections.newSetFromMap(new IdentityHashMap<E, Boolean>()) (вместо HashSet), который не требует каких-либо оберток ваших элементов или чего-либо еще.

0 голосов
/ 24 марта 2012

Если ваш объект реализует метод equals, вы можете выполнить любое сравнение, которое вам нужно сделать, чтобы определить, являются ли два ваших Node объекта уникальными.

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