Pregunta

Tengo un Array de Objetos que necesitan los duplicados eliminados/filtrado.Yo solo iba a reemplazar es igual a & hachCode en el Objeto de elementos y, a continuación, pegarlos en un Conjunto...pero pensé que al menos debe encuesta de stackoverflow para ver si había otra manera, tal vez algún método inteligente de algunos otros de la API?

¿Fue útil?

Solución

Yo estaría de acuerdo con su enfoque para reemplazar hashCode() y equals() y el uso de algo que implementa Set.

Al hacerlo, también se hace absolutamente claro a cualquier otro de los desarrolladores de que el duplicado no característica es necesaria.

Otra razón - puedes elegir una aplicación que se adapte a sus necesidades mejor ahora:

y usted no tiene que cambiar el código para cambiar la implementación en el futuro.

Otros consejos

He encontrado esto en la web

Aquí hay dos métodos que le permiten eliminar duplicados en un ArrayList. removeDuplicate no mantiene el orden donde como removeDuplicateWithOrder mantiene el orden con un poco de sobrecarga de rendimiento.

  1. El Método removeDuplicate:

    /** List order not maintained **/
    public static void removeDuplicate(ArrayList arlList)
    {
     HashSet h = new HashSet(arlList);
     arlList.clear();
     arlList.addAll(h);
    }
    
  2. El Método removeDuplicateWithOrder:

    /** List order maintained **/
    public static void removeDuplicateWithOrder(ArrayList arlList)
    {
       Set set = new HashSet();
       List newList = new ArrayList();
       for (Iterator iter = arlList.iterator(); iter.hasNext();) {
          Object element = iter.next();
          if (set.add(element))
             newList.add(element);
       }
       arlList.clear();
       arlList.addAll(newList);
    }
    

Primordial equals y hashCode y la creación de un set, fue mi primer pensamiento demasiado.Es una buena práctica tener alguna versión sustituida de estos métodos de todos modos en su jerarquía de herencia.

Yo creo que si se utiliza un LinkedHashSet incluso podrá conservar el orden de los elementos únicos...

Básicamente, usted quiere una aplicación que soporta el LinkedHashSet<T> List<T> interfaz para el acceso aleatorio. Por lo tanto, esto es lo que necesita:

  

public class LinkedHashSetList<T> extends LinkedHashSet<T> implements List<T> {

     

// Implementations for List<T> methods here   ...

     

}

La aplicación de los métodos <=> podría acceder y manipular el subyacente <=>. El truco es tener esta clase se comportan correctamente cuando se intenta añadir duplicados a través de los <=> añadir métodos (lanzando una excepción o volver a añadir el artículo a un índice diferente sería opciones: o bien que se puede elegir uno de o hacer configurable los usuarios de la clase).

Utilice una lista distinctList al elemento de registro en la primera vez iterator tropezar en ella, devuelve la lista como distinctList eliminado todos los duplicados

 private List removeDups(List list) {
        Set tempSet = new HashSet();
        List distinctList = new ArrayList();
        for(Iterator  it = list.iterator(); it.hasNext();) {
            Object next = it.next();
            if(tempSet.add(next)) {
                distinctList.add(next);
            } 
        }
        return distinctList;
   } 

Me gustaría reiterar el argumento de Jason en los comentarios:

¿Por qué se coloque en ese punto en absoluto?

¿Por qué utilizar una matriz de una estructura de datos que no deberían contener duplicados en absoluto?

Utilice un Set o una SortedSet (cuando los elementos tienen un orden natural también) en todo momento para mantener los elementos. Si usted necesita para mantener el orden de inserción, a continuación, puede utilizar la LinkedHashSet como se ha señalado.

Tener a post-proceso de alguna estructura de datos es a menudo un indicio de que debería haber elegido una diferente, para empezar.

Por supuesto, el post original plantea la pregunta, "¿Cómo consiguió esa matriz (que puede contener entradas duplicadas) en el primer lugar?"

¿Necesita la matriz (con duplicados) para otros fines, o podría simplemente utilizar un conjunto de principios?

Alternativamente, si usted necesita saber el número de ocurrencias de cada valor, se puede utilizar un Map<CustomObject, Integer> para rastrear conteos. Además, el definición de las clases Multimap Google Colecciones puede ser de utilidad.

A Set es sin duda la mejor opción. La única manera de eliminar las cosas desde una matriz (sin crear una nueva) es nulo a cabo, y luego se termina con una gran cantidad de nulos controles más tarde.

Hablando desde un estándar de programación general siempre se puede enumerar el doble de las colecciones entonces el comparar el origen y el destino.

Y si su enumeración interior siempre se inicia después de una entrada de la fuente, es bastante eficiente (pseudo código a seguir)

foreach ( array as source )
{
    // keep track where we are in the array
    place++;
    // loop the array starting at the entry AFTER the current one we are comparing to
    for ( i=place+1; i < max(array); i++ )
    {
        if ( source === array[place] )
        {
            destroy(array[i]);
        }
    }
}

Se podría añadir sin duda un descanso; declaración después de la destruyes, pero entonces sólo se descubre el primer duplicado, pero si eso es todo lo que tendrá que tener, entonces sería una buena optimización pequeña.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top