5

Как удалить повторяющиеся элементы из ArrayList?

14

У меня есть ArrayList<String>, и я хочу удалить из него повторяющиеся строки. Как я могу это сделать?

5 ответ(ов)

11

Если вы не хотите, чтобы в Collection были дубликаты, стоит задуматься о том, почему вы используете коллекцию, которая допускает дубликаты. Самый простой способ удалить повторяющиеся элементы — добавить содержимое в Set (который не допускает дубликаты), а затем вернуть Set обратно в ArrayList:

Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);

Однако стоит учитывать, что этот метод нарушит порядок элементов в ArrayList.

3

Хотя преобразование ArrayList в HashSet эффективно удаляет дубликаты, если вам нужно сохранить порядок вставки, я бы предложил использовать следующий вариант:

// list - это какой-то List строк
Set<String> s = new LinkedHashSet<>(list);

Затем, если вам нужно снова получить ссылку на List, вы можете снова использовать конструктор преобразования.

0

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

// удаляем дубликаты (если они есть) из 'myArrayList'
myArrayList = new ArrayList<String>(new LinkedHashSet<String>(myArrayList));

Этот код создает новое множество на основе myArrayList, что автоматически удаляет дубликаты, а затем преобразует это множество обратно в список, сохраняя порядок элементов.

0

Вот способ, который не нарушает порядок элементов в списке:

ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();

Iterator iterator = l1.iterator();

while (iterator.hasNext()) {
    YourClass o = (YourClass) iterator.next();
    if (!l2.contains(o)) l2.add(o);
}

Здесь l1 — это исходный список, а l2 — список, из которого удалены повторяющиеся элементы. Не забудьте переопределить метод equals в классе YourClass в соответствии с тем, как вы хотите определять равенство объектов.

0

Для решения вашей проблемы с удалением дубликатов по полю firstName в списке объектов SomeClass, вы можете использовать следующий код:

private List<SomeClass> clearListFromDuplicateFirstName(List<SomeClass> list1) {
    Map<String, SomeClass> cleanMap = new LinkedHashMap<>();
    for (int i = 0; i < list1.size(); i++) {
        cleanMap.put(list1.get(i).getFirstName(), list1.get(i));
    }
    List<SomeClass> list = new ArrayList<>(cleanMap.values());
    return list;
}

Этот метод создает LinkedHashMap, который сохраняет порядок вставки элементов и использует firstName в качестве ключа. При добавлении элементов в карту, если firstName уже существует, то новое значение будет просто перезаписывать старое. Это позволяет вам оставить только уникальные имена. В конечном итоге, вы преобразуете значения карты обратно в ArrayList и возвращаете его.

Таким образом, этот код эффективно убирает дубликаты по полю firstName, сохраняя при этом порядок элементов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь