Вопрос по java, duplicates, list – Удаление повторяющихся элементов из списка

5

Я разработал список массивов.

<code>ArrayList<String> list = new ArrayList<String>();

list.add("1");
list.add("2");
list.add("3");
list.add("3");
list.add("5");
list.add("6");
list.add("7");
list.add("7");
list.add("1");
list.add("10");
list.add("2");
list.add("12");
</code>

Но, как видно выше, он содержит много дублирующих элементов. Я хочу удалить все дубликаты из этого списка. Для этого я думаю, что сначала мне нужно преобразовать список в набор.

Предоставляет ли Java функциональность преобразования списка в набор? Есть ли другие средства для удаления дубликатов из списка?

Почему вы не создали набор для начала? Patrick
возможный дубликатHow do I remove repeated elements from ArrayList? Raedwald
Set & л; Строка & GT; Set = new HashSet & lt; String & gt; (список); Subhrajyoti Majumder
Вы должны принять ответ Tyler Gabb

Ваш Ответ

7   ответов
9

Это:

Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);
@Abshiek, спасибо, так что в конечном итоге java предоставляет нам функциональность преобразования списка в набор. dghtr
@ user1351820 На самом деле Java предоставляет конструктор для инициализацииCollection с любым другимCollection так что это еще шире :)
24

Вы можете конвертировать в набор с:

Set<String> aSet = new HashSet<String>(list);

Или вы можете преобразовать в набор и вернуться к списку с помощью:

list = new ArrayList<String>(new HashSet<String>(list));

Оба они, однако, вряд ли сохранят порядок элементов. Чтобы сохранить порядок, вы можете использоватьHashSet в качестве вспомогательной структуры при итерации:

List<String> list2 = new ArrayList<String>();
HashSet<String> lookup = new HashSet<String>();
for (String item : list) {
    if (lookup.add(item)) {
        // Set.add returns false if item is already in the set
        list2.add(item);
    }
}
list = list2;

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

@ user1351820 - преобразование вSet устраняет дубликаты. Преобразование обратно вList предоставляет вам коллекцию с фиксированным (но неопределенным) порядком, в которой вы можете получить доступ к элементам по индексу. Если все, что вам нужно, это коллекция (без какого-либо определенного порядка - включая, возможно, другой порядок на разных итерациях неизмененного набора), просто перейдите к первому варианту. Если вам нужно сохранить первоначальный порядок, переходите к третьему.
Привет Тед, большое спасибо, не могли бы вы объяснить list = new ArrayList & lt; String & gt; (new HashSet & lt; String & gt; (list)); Во-первых, мы немного преобразуем список в набор, а во-вторых, пытаемся преобразовать список обратно в список. dghtr
0
package com.scjp.dump.test;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class ArrayListTest {

    public static void main(String[] args) {

        List<Integer> mylist2 = new ArrayList<Integer>();

        List<Integer> mylist1 = new ArrayList<Integer>();
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(5);
        mylist1.add(9);
        mylist1.add(2);
        mylist1.add(5);
        mylist1.add(5);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(9);
        mylist1.add(56);
        System.out.println(mylist1);
        Iterator<Integer> itr1 = mylist1.listIterator();
        while (itr1.hasNext()) {
            Integer itn1 = (Integer) itr1.next();
            if (mylist2.contains(itn1) == false)
                mylist2.add(itn1);
        }

        System.out.println(mylist2);

    }

}
3

Если вам нужно сохранить порядок элементов, тогда используйте LinkedHashSet вместо HashSet

Set<String> mySet = new LinkedHashSet<String>(list);
1

Просто используйте нормальный конструктор:

ArrayList<T> yourList;
HashSet,<T> set = new HashSet<T>(yourList);

И у вас будет новый вид элементов с удаленными дубликатами, но вы потеряете порядок. Это верно в каждом ответе, опубликованном до сих пор. Чтобы сохранить порядок, вы должны выполнять итерацию в существующем списке и удалять элемент только в том случае, если он является дубликатом (что можно сделать с помощью набора, чтобы проверить, был ли элемент уже найден).

5

Java 8 путь: list.stream().distinct().collect(Collectors.toList());

сделанный :)

Вы все еще возвращаетеList хотя вы удалили дубликаты. Это отвечает на базовый вопрос, но оригинальный автор комментирует, что он ожидает ответа о «преобразовании списка в набор».
Вы могли бы просто сделатьCollectors.toSet() в конце вместо.toList() если установлен желательный.
0

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

 Set<String> set = new TreeSet<String>(list);

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