Добавьте все строки к словарю и получите свойство Keys впоследствии. Это произведет каждую уникальную строку, но не обязательно в том же порядке, в котором Ваш исходный вход имел их.
, Если Вы требуете конечного результата иметь тот же порядок как исходный вход, когда Вы рассматриваете первое происшествие каждой строки, используют следующий алгоритм вместо этого:
В конце, список содержит первое происшествие каждой уникальной строки.
Удостоверяются, что Вы рассматриваете вещи как культура и такой при построении словаря, чтобы удостовериться, что Вы обрабатываете дубликаты с буквами с диакритическим знаком правильно.
Вам необходимо переопределить equals (Object)
. Вместо этого вы реализовали метод equals
с сигнатурой equals (Subclass)
. Следовательно, ваш HashSet
использует метод по умолчанию equals (Object)
, определенный в Object
для проверки равенства.
По умолчанию equals (Object)
основана на идентификаторе объекта, и, следовательно, набор «позволяет» вам добавить две String
s, которые, хотя семантически равны, не являются одним и тем же объектом.
Вы неправильно переопределили Object.equals ()
.
@Override
public boolean equals(Object other) {
if ((other == null) || !(other instanceof Subclass)) {
return false;
}
return ((Sublcass) other).getAcctNbr().equals(this.getAcctNbr());
}
Метод boolean equals (Subclass other)
создает второй метод, который является не то, что вы намеревались сделать.
Первое предположение, похоже, ваш равно (Подкласс другой)
должен быть equals (Другой объект)
, чтобы переопределить метод java.lang.Object.equals ()
, как вы хотите. Вероятно, набор вызывает базовую реализацию equals ()
.
Две мета-точки:
Во-первых, возьмите за привычку использовать @Override
каждый раз, когда вы считаете, что переопределяете метод. Это привело бы к тому, что ваш примерный код не скомпилировался, что привело бы вас к обнаружению проблемы.
Во-вторых, если вы используете IDE, и она не выделяет для вас красивое жирное предупреждение, она неправильно настроена! Вы должны это исправить!
А если вы не используете IDE - вам действительно, действительно следует. Как только вы наберете public boolean equals (Subclass other)
, текст изменит цвет и отобразится предупреждение, сообщающее вам, в чем ваша вероятная проблема.
Между прочим, стандартная идиома для equals ()
, к которому я пришел:
@Override public boolean equals(Object object) {
if (object instanceof Subclass) {
Subclass that = (Subclass) object;
return this.anInt == that.anInt
&& this.aString.equals(that.aString); // for example
}
return false;
}
В некоторых случаях, стоит добавить if (object == this) {return true; }
но на самом деле не стоит делать это регулярно.
Ваш метод equals никогда не вызывается. Сигнатура равно
требует, чтобы он принимал Объект
, а не какой-либо другой класс (включая любой класс, который реализует равно
).
public boolean equals(Object other) {
...
}