2010-02-10 19 views
33

que leer datos de un archivo de texto, por lo que puede ser:Guardar una lista de cadenas únicas en el ArrayList

 
John 
Mary 
John 
Leeds 

Ahora necesito obtener 3 elementos únicos en el ArrayList, porque sólo hay 3 único valores en la salida del archivo (como arriba).

Puedo usar una HashTable y agregarle información, luego simplemente copiar sus datos en la Lista. ¿Hay otras soluciones?

Respuesta

73

¿Por qué necesita almacenarlo en un List? ¿Realmente necesita que se ordenen los datos o admite búsquedas basadas en índices?

Sugeriría almacenar los datos en un Set. Si el pedido no es importante, debe usar HashSet. Sin embargo, si desea conservar el orden, puede usar LinkedHashSet.

+1

¿Por qué? Las listas de causas se usan con más frecuencia y es fácil trabajar con ellas. Creo que si escribes código para otros desarrolladores, es mejor devolver un tipo de lista que cualquier otro tipo. – EugeneP

+0

No necesariamente. El único caso donde necesitaría una lista es si desea acceso indexado aleatorio a los elementos en las colecciones. De lo contrario, sería preferible ir con HashSet o LinkedHashSet. –

+0

En mi opinión, el código es más claro cuando usa indice. Usted tiene el control sobre "dónde se encuentra" dentro de la estructura de datos. Puede provenir de mi experiencia con el lenguaje C. – EugeneP

16

Puede marcar list.contains() antes de agregar.

if(!list.contains(value)) { 
    list.add(value); 
} 

¡Supuse que sería obvio! Sin embargo, agregar elementos a un HashSet y luego crear una lista de este conjunto sería más eficiente.

+0

Supongo que usa el método "iguales"? – EugeneP

+0

Sí, sí utiliza equals() en la cadena internamente. –

+0

Sí. Gracias. En mi caso, eso sería preferible, porque el código se mantendrá limpio. Pero creo que el algoritmo HashTable es más rápido que el método contains, a menos que usen una HashTable internamente. – EugeneP

61

Si usted tiene un List duplicados que contienen, y quieres un List fuera, usted podría hacer:

List<String> newList = new ArrayList<String>(new HashSet<String>(oldList)); 

Es decir, envolver la lista antigua en un conjunto para eliminar duplicados y envolver ese conjunto en una lista de nuevo.

+0

Supongo que no hay garantía de que la clasificación de 'newList' sea la misma que la de' oldList', o? – Marvin

+7

O.k. Encontré la respuesta a mi comentario: si usas 'LinkedHashSet' en lugar de' HashSet', conservas el orden. – Marvin

1

Aquí es cómo lo resolví:

import groovy.io.*; 
def arr = ["5", "5", "7", "6", "7", "8", "0"] 
List<String> uniqueList = new ArrayList<String>(new HashSet<String>(arr.asList())); 
System.out.println(uniqueList) 
0
class HashSetList<T extends Object> 
    extends ArrayList<T> { 

    private HashSet<Integer> _this = new HashSet<>(); 

    @Override 
    public boolean add(T obj) { 
     if (_this.add(obj.hashCode())) { 
      super.add(obj); 
      return true; 
     } 
     return false; 
    } 
} 

ahora el uso de ese tipo de estructura para pequeños programas, que significa que usted tiene poca sobrecarga para tener captadores y definidores pero singularidad. Además, puede anular hashCode para decidir si su elemento es igual a otro.

+0

Buena idea, pero ... ¿qué tal eliminar y agregar (int, *) etc.? Esta solución no está completa. –

Cuestiones relacionadas