Подтвердить что ты не робот

Как предотвратить добавление дубликатов объектов в ArrayList

Возможный дубликат:
Предотвращение дублирования записей в arraylist

У меня есть arraylist определенного класса C.

List<C> myList = new ArrayList<C>();

Класс C имеет два атрибута:

String str1;
String str2;

Теперь, когда и когда я добавляю объекты типа C в myList ArrayList, я хочу проверить, существует ли уже существующий объект в списке со значениями str1 и str2, соответствующими значениям параметров (str1 и str2) объекта, который я собираюсь добавить.

Есть ли эффективный способ сделать это без необходимости повторять каждый раз через полный список и проверять соответствие между параметрами?

4b9b3361

Ответ 1

Вам нужно переопределить метод equals в классе C.

например.

public boolean equals(Object c) {
    if(c !instanceof C) {
        return false;
    }

    C that = (C)c;
    return this.str1.equals(that.getStr1()) && this.str2.equals(that.getStr2());
}

Затем вы можете вызвать myList.contains(viz), чтобы увидеть, содержит ли список уже равный объект.

Это не проверено, вам может понадобиться дополнительная обработка ошибок.

Если вы переопределите метод equals, как это, вы также должны убедиться, что вы переопределите метод hashcode(). См.: http://www.technofundo.com/tech/java/equalhash.html

Edit: Как указано в комментариях, реализация набора будет более эффективной, хотя вам все равно придется переопределить метод equals/hashcode, поэтому приведенный выше пример лучше всего использовать в сочетании с ответом Karthiks выше.

Ответ 2

Если вам нужно проверить наличие дубликатов или обеспечить уникальные значения, подумайте об использовании Set - как структуры данных, а не списка.

Вы можете выбрать один из следующих вариантов:

  • HashSet

    • Более быстрый доступ - O (1) доступ грубо говоря.
    • не отсортировано
    • Хэш-таблица, используемая в качестве базового хранилища.
  • TreeSet

    • Более медленный доступ (относительно HashSet) - O (log (n))
    • значения отсортированы автоматически.
    • Красно-черное дерево, используемое в качестве базового хранилища.

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

Обратите внимание, что для этого вам необходимо переопределить equals и hashcode, чтобы сообщить Set, как сравнивать ваши объекты. Этот шаг лучше объясняется в Какие проблемы следует учитывать при переопределении равных и hashCode в Java?

Ответ 3

if (yourList.contains(Object object))
{
    // do not add
}