Eliminar elementos duplicados de una lista

He desarrollado una lista de matriz.

ArrayList list = new ArrayList(); 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"); 

Pero como se ve arriba, contiene muchos elementos duplicados. Quiero eliminar todos los duplicados de esa lista. Para esto, creo que primero necesito convertir la lista en un conjunto.

¿Proporciona Java la funcionalidad de convertir una lista en un conjunto? ¿Hay otras instalaciones para eliminar duplicados de una lista?

Puedes convertir a un Set con:

 Set aSet = new HashSet(list); 

O puede convertir a un conjunto y volver a una lista con:

 list = new ArrayList(new HashSet(list)); 

Ambos, sin embargo, no es probable que preserven el orden de los elementos. Para conservar el orden, puede usar un HashSet como estructura auxiliar mientras itera:

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

En el caso de duplicados, solo la primera aparición aparecerá en el resultado. Si desea que solo aparezca la última aparición, es un problema más difícil. Lo abordaría invirtiendo la lista de entrada, aplicando lo anterior y luego invirtiendo el resultado.

Esta:

 Set set = new HashSet(); set.addAll(list); list.clear(); list.addAll(set); 

Java 8 vía: list.stream().distinct().collect(Collectors.toList());

hecho 🙂

Si necesita conservar el orden de los elementos, utilice LinkedHashSet en lugar de HashSet

 Set mySet = new LinkedHashSet(list); 

Solo usa el constructor normal:

 ArrayList yourList; HashSet set = new HashSet(yourList); 

Y tendrá una nueva vista de los elementos, con los duplicados eliminados, pero perderá el orden. Esto es cierto en todas las respuestas publicadas hasta ahora. Para seguir ordenando debe iterar en la lista existente y eliminar un elemento solo si es un duplicado (lo que se puede hacer usando un conjunto para verificar si ya se encontró un elemento).

Puedes usar un set en primer lugar o convertirlo en él:

  Set set = new TreeSet(list); 
 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 mylist2 = new ArrayList(); List mylist1 = new ArrayList(); 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 itr1 = mylist1.listIterator(); while (itr1.hasNext()) { Integer itn1 = (Integer) itr1.next(); if (mylist2.contains(itn1) == false) mylist2.add(itn1); } System.out.println(mylist2); } }