Установка хэш-кода и равных для создания набора с уникальным объектом

Я бы создал Set именно так HashSet только содержит char.например a,b,c,d,e,f,g...но эти chars не представлены примитивным типом, но у меня есть объект

public FirstChar{

  private char c;

  public FirstChar(char c){

    this.c = c;

  }
}

Теперь я хочу добавить объект FirstChar в набор, но чтобы избежать повторяющихся элементов, я должен реализовать HashCode() а также equals()

Я знаю как реализовать equals но как я могу реализовать hashcode каким образом я мог иметь только один элемент в наборе?

NB. Пожалуйста, не говорите мне, чтобы использовать Eclipse

2 ответа

РЕДАКТИРОВАТЬ: я только что прочитал ваш комментарий, что вы хотите только одну букву во всем наборе - что звучит как очень странное требование, но в основном это выполняется что-то вроде:

public final class FirstChar {

  private final char c;

  public FirstChar(char c) {
    this.c = c;
  }

  @Override public int hashCode() {
      return 0;
  }

  @Override public boolean equals(Object other) {
      return other instanceof FirstChar;
  }
}

Другими словами, каждый случай FirstChar считается равным любому другому экземпляру, и все они имеют одинаковый хэш-код. Как я уже сказал, это действительно странно... это определенно то, что вы хотите?


Оригинальный ответ

Внедрение hashCode() для значения, которое логически имеет только один символ, легко:

@Override
public int hashCode() {
    return c; // Use implicit conversion to int
}

Проверить по договору Object.hashCode и вы обнаружите, что это работает нормально - при условии, что ваш equals Метод в основном просто сравнивает значения c, (Непонятно, что вы имели в виду, когда писали "так, как я мог бы иметь только один элемент в наборе" - я предполагаю, что вы имеете в виду только один элемент на отдельный символ.)

Тем не менее, я запутался относительно того, какова ценность вашего FirstChar класс обеспечивает только с помощью java.lang.Character, Есть ли причина, по которой вы не можете просто использовать Set<Character>?

В любом случае, насколько я могу судить, hashCode метод в Character класс просто возвращает char как int,

В вашем конкретном случае, если вы хотите, чтобы набор содержал только первый FirstChar добавив к нему, вы можете сделать все FirstCharравны друг другу:

class FirstChar{
    private char c;
    public FirstChar(char c){
        this.c=c;
    }
    public String toString(){
        return String.valueOf(c);
    }
    public boolean equals(Object o){
        return o instanceof FirstChar;
    }
    public int hashCode(){        
        return 42;
    }
}

Но если у вас нет очень веских причин, это не звучит как хорошая идея.

Другие вопросы по тегам