Как удалить повторяющиеся элементы из ArrayList?
У меня есть ArrayList<String>
, и я хочу удалить из него повторяющиеся строки. Как я могу это сделать?
5 ответ(ов)
Если вы не хотите, чтобы в Collection
были дубликаты, стоит задуматься о том, почему вы используете коллекцию, которая допускает дубликаты. Самый простой способ удалить повторяющиеся элементы — добавить содержимое в Set
(который не допускает дубликаты), а затем вернуть Set
обратно в ArrayList
:
Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);
Однако стоит учитывать, что этот метод нарушит порядок элементов в ArrayList
.
Хотя преобразование ArrayList
в HashSet
эффективно удаляет дубликаты, если вам нужно сохранить порядок вставки, я бы предложил использовать следующий вариант:
// list - это какой-то List строк
Set<String> s = new LinkedHashSet<>(list);
Затем, если вам нужно снова получить ссылку на List
, вы можете снова использовать конструктор преобразования.
Вы можете сделать это следующим образом и сохранить порядок:
// удаляем дубликаты (если они есть) из 'myArrayList'
myArrayList = new ArrayList<String>(new LinkedHashSet<String>(myArrayList));
Этот код создает новое множество на основе myArrayList
, что автоматически удаляет дубликаты, а затем преобразует это множество обратно в список, сохраняя порядок элементов.
Вот способ, который не нарушает порядок элементов в списке:
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
в соответствии с тем, как вы хотите определять равенство объектов.
Для решения вашей проблемы с удалением дубликатов по полю 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
, сохраняя при этом порядок элементов.
Инициализация ArrayList в одну строчку
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как создать новый список в Java
Преобразование списка в массив в Java
Как преобразовать Map в List в Java?