установка хэш-кода и равных для создания набора с уникальным объектом - PullRequest
1 голос
/ 13 декабря 2011

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

public FirstChar{

  private char c;

  public FirstChar(char c){

    this.c = c;

  }
}

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

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

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

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

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

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() * * * * * * * * 101 '* для значения, которое логически имеет только один символ, легко:

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

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

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

1 голос
/ 13 декабря 2011

В любом случае, насколько я могу судить, метод 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;
    }
}

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

...