HashSet позволяет дубликаты

Добавьте все строки к словарю и получите свойство Keys впоследствии. Это произведет каждую уникальную строку, но не обязательно в том же порядке, в котором Ваш исходный вход имел их.

, Если Вы требуете конечного результата иметь тот же порядок как исходный вход, когда Вы рассматриваете первое происшествие каждой строки, используют следующий алгоритм вместо этого:

  1. Имеют список (окончательный результат) и словарь (для проверки на дубликаты)
  2. Для каждой строки во входе, проверяют, существует ли это уже в словаре
  3. , В противном случае добавляют его и к словарю и к списку

В конце, список содержит первое происшествие каждой уникальной строки.

Удостоверяются, что Вы рассматриваете вещи как культура и такой при построении словаря, чтобы удостовериться, что Вы обрабатываете дубликаты с буквами с диакритическим знаком правильно.

7
задан vaxquis 8 July 2014 в 16:47
поделиться

5 ответов

Вам необходимо переопределить equals (Object) . Вместо этого вы реализовали метод equals с сигнатурой equals (Subclass) . Следовательно, ваш HashSet использует метод по умолчанию equals (Object) , определенный в Object для проверки равенства.

По умолчанию equals (Object) основана на идентификаторе объекта, и, следовательно, набор «позволяет» вам добавить две String s, которые, хотя семантически равны, не являются одним и тем же объектом.

20
ответ дан 6 December 2019 в 06:03
поделиться

Вы неправильно переопределили 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) создает второй метод, который является не то, что вы намеревались сделать.

5
ответ дан 6 December 2019 в 06:03
поделиться

Первое предположение, похоже, ваш равно (Подкласс другой) должен быть equals (Другой объект) , чтобы переопределить метод java.lang.Object.equals () , как вы хотите. Вероятно, набор вызывает базовую реализацию equals () .

0
ответ дан 6 December 2019 в 06:03
поделиться

Две мета-точки:

Во-первых, возьмите за привычку использовать @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; } но на самом деле не стоит делать это регулярно.

3
ответ дан 6 December 2019 в 06:03
поделиться

Ваш метод equals никогда не вызывается. Сигнатура равно требует, чтобы он принимал Объект , а не какой-либо другой класс (включая любой класс, который реализует равно ).

public boolean equals(Object other) {
    ...
}
0
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: