2013-05-03 3 views
1

Может ли кто-нибудь сказать мне, что должна делать следующая строка в коде, предоставленном моим наставником?Найти дубликаты в ArrayList

if (data.contains(entry)) 

Полный метод:

public String add(Entry entry) { 
    if (entry == null) 
     return "Error: null entry"; 
    if (data.contains(entry)) 
     return "Error: this entry already in the book"; 

    boolean done = data.add(entry);  
    if (done) 
     return " entry added"; 
    else 
     return "entry could not be added"; 
    } 

Я думал, что это была проверка существующей записи с теми же реквизитами внутри ArrayList, но когда я добавляю дубликат записи оно не вдаваться в if заявление так вычислял я ошибочно? Я искал в Интернете, и он говорит, что для этого так почему же он не работает для меня?

+0

вы пытались сравнивать объекты вне если, чтобы увидеть, если одни и те же (с помощью равенства метод)? http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#contains(java.lang.Object) – lcguida

+0

@rockskull havent сделал что-либо с методами в этом классе, так как мы не могут изменить его в любом случае. Мы расширили классы, заданные для создания адресной книги. Он, должно быть, хочет, чтобы мы использовали это, каким-то образом, почему бы их там положить? – ToniHopkins

+0

Кроме того, стоит отметить, что возвращение статуса строки из метода Java не является нормальным. Вместо этого, если у вас нет значимого возвращаемого значения, сделайте его «методом void». Если что-то пойдет не так, выбросьте исключение. –

ответ

6

Помните, что выполняет проверку равенства с equals(). Поэтому, если ваш объект не переопределяет этот метод, он не будет считать объекты равными, если они не являются одной и той же ссылкой на объект.

Конечно, не переопределяйте equals() без переопределения hashCode().

И, наконец, если вы не хотите, чтобы дублирующие объекты рассматривали использование Set.

+1

Чтобы прояснить, если вы не перегружаете 'equals', два экземпляра не примитивных объектов никогда не будут считаться равными (поскольку он использует адрес памяти экземпляр), и поэтому 'contains' всегда будет возвращать false. –

+0

@ DuncanJones Я не могу изменить этот метод в любом случае (любой из классов, если на то пошло), значит ли это, что это нецелесообразно, если он фактически не проверяет дубликаты записей? Appologies im new для java – ToniHopkins

+0

@ToniHopkins Чтобы быть понятным, можете ли вы редактировать класс 'Entry'? –

0

Метод списка вы увидите, что он использует метод equals() для оценки того, являются ли два объекта одинаковыми.

внутренняя логика as per docs

(o==null ? e==null : o.equals(e)); 

Таким образом, вы должны ovveride метод equals к compare их

Смежные вопросы