Установка хэш-кода и равных для создания набора с уникальным объектом
Я бы создал 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 ответа
РЕДАКТИРОВАТЬ: я только что прочитал ваш комментарий, что вы хотите только одну букву во всем наборе - что звучит как очень странное требование, но в основном это выполняется что-то вроде:
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;
}
}
Но если у вас нет очень веских причин, это не звучит как хорошая идея.