Как расширить HashSet в Java? - PullRequest
0 голосов
/ 26 марта 2012

Допустим, у меня есть класс CategoryKey:

public class CategoryKey {
    public int layer;
    public int parent;
    public int child;
}

Я пытаюсь поместить множество его экземпляров в Set, но, как мы знаем, HashSet не подходит для хранения экземпляровпользовательские классы.Итак, как я могу расширить класс Java HashSet для удовлетворения моих требований?Или как я могу создать новый класс, реализующий интерфейс Set для решения той же проблемы?

Ответы [ 3 ]

10 голосов
/ 26 марта 2012

но, как мы знаем, HashSet не подходит для экземпляров магазина обычного класса

Да, пока вы пишете свой класс соответствующим образом.В частности:

  • Вы должны переопределить equals() и hashCode()
  • Вы должны сделать свой тип неизменяемым
  • Вы не должны использовать открытые поля

Например:

public final class CategoryKey {
  private final int layer;
  private final int parent;
  private final int child;

  public CategoryKey(int layer, int parent, int child) {
    this.layer = layer;
    this.parent = parent;
    this.child = child;
  }

  public int getLayer() {
    return layer;
  }

  public int getParent() {
    return parent;
  }

  public int getChild() {
    return child;
  }

  @Override public boolean equals(Object other) {
    if (!(other instanceof CategoryKey)) {
      return false;
    }
    CategoryKey otherKey = (CategoryKey) other;
    return layer == otherKey.layer
      && parent == otherKey.parent
      && child == otherKey.child;
  }

  @Override public int hashCode() {
    int hash = 23;
    hash = hash * 31 + layer;
    hash = hash * 31 + parent;
    hash = hash * 31 + child;
    return hash;
  }
}
2 голосов
/ 26 марта 2012

Почему HashSet не подходит для хранения экземпляров пользовательских классов?

Пока ваш класс имеет правильную реализацию equals() и hashCode(), он должен работать нормально.

1 голос
/ 26 марта 2012

Переопределить equals и hashCode метод CategoryKey для предоставления уникального экземпляра в Set

Коллекция, которая не содержит повторяющихся элементов. Более формально устанавливает не содержат пары элементов e1 и e2, для которых e1.equals (e2) и самый один нулевой элемент.

См. здесь

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