2012-04-29 5 views
3

Я разработал список массивов.Удаление повторяющихся элементов из списка

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"); 

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

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

+2

Почему ты этого не сделал создать набор для начала? – Patrick

+1

Set Set = new HashSet (список); –

+0

Возможный дубликат [Как удалить повторяющиеся элементы из ArrayList?] (Http://stackoverflow.com/questions/203984/how-do-remove-repeated-elements-from-arraylist) – Raedwald

ответ

9

Это:

Set<String> set = new HashSet<String>(); 
set.addAll(list); 
list.clear(); 
list.addAll(set); 
+0

@Abshiek, Спасибо, поэтому в конечном счете java предоставляет нам функциональность преобразования списка в набор. – dghtr

+4

@ user1351820 На самом деле Java предоставляет конструктор для инициализации 'Collection' с любой другой' Collection', поэтому он еще шире :) – Jack

0

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

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

Вы можете преобразовать в набор с:

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; 

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

+0

Привет, Ted, спасибо, пожалуйста, объясните list = new ArrayList (новый HashSet (список)) ; вначале мы конвертируем список в набор и во втором пытаемся преобразовать его обратно в список. – dghtr

+1

@ user1351820 - Преобразование в 'Set' исключает дубликаты. Преобразование обратно в «Список» дает вам коллекцию с фиксированным (но неопределенным) порядком, где вы можете обращаться к элементам по индексу. Если вам нужна коллекция (без какого-либо определенного порядка - включая, возможно, различный порядок на разных итерациях неизменной коллекции), просто перейдите к первому варианту. Если вам нужно сохранить первоначальный порядок, перейдите к третьему. –

1

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

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

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

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); 
3

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

сделано :)

+0

Вы по-прежнему возвращаете «Список», хотя вы удалили дубликаты. Это отвечает базовому вопросу, но исходный плакат комментирует, что он ожидает ответа о «преобразовании списка в набор». – YoYo

+1

Вы можете просто сделать 'Collectors.toSet()' в конце вместо '.toList()', если Set желателен. –