una remove objetos nodo metodo listas lista eliminar elemento como buscar java arraylist deduplication

remove - metodo buscar en listas java



Cómo quitar una lista de objetos? (5)

Un objeto Rec tiene una variable miembro llamada tag que es una String .

Si tengo una List de Rec , ¿cómo podría deducir la lista en función de la tag miembro de la tag ?

Solo necesito asegurarme de que la List contenga solo una Rec con cada valor de tag .

Algo como lo siguiente, pero no estoy seguro de cuál es el mejor algoritmo para mantener el conteo de pistas, etc.

private List<Rec> deDupe(List<Rec> recs) { for(Rec rec : recs) { // How to check whether rec.tag exists in another Rec in this List // and delete any duplicates from the List before returning it to // the calling method? } return recs; }


Esto se vuelve más fácil si Rec es .equals función de su valor de tag . Entonces podrías escribir algo como:

private List<Rec> deDupe( List<Rec> recs ) { List<Rec> retList = new ArrayList<Rec>( recs.size() ); for ( Rec rec : recs ) { if (!retList.contains(rec)) { retList.add(rec); } } return retList; }


Lo haría con las colecciones de google. Puede usar la función de filtro, con un predicado que recuerde las etiquetas anteriores, y filtra las Rec con una etiqueta que haya estado allí antes. Algo como esto:

private Iterable<Rec> deDupe(List<Rec> recs) { Predicate<Rec> filterDuplicatesByTagPredicate = new FilterDuplicatesByTagPredicate(); return Iterables.filter(recs, filterDuplicatesByTagPredicate); } private static class FilterDuplicatesByTagPredicate implements Predicate<Rec> { private Set<String> existingTags = Sets.newHashSet(); @Override public boolean apply(Rec input) { String tag = input.getTag(); return existingTags.add(tag); } }

Cambié ligeramente el método para devolver Iterable en lugar de List, pero por supuesto que cambias eso si eso es importante.


Prueba esto:

private List<Rec> deDupe(List<Rec> recs) { Set<String> tags = new HashSet<String>(); List<Rec> result = new ArrayList<Rec>(); for(Rec rec : recs) { if(!tags.contains(rec.tags) { result.add(rec); tags.add(rec.tag); } } return result; }

Esto verifica cada Rec frente a un Set de etiquetas. Si el conjunto ya contiene la etiqueta, es un duplicado y lo omitimos. De lo contrario, agregamos el Rec a nuestro resultado y agregamos la etiqueta al conjunto.


Almacénelo temporalmente en HashMap<String,Rec> .

Cree un HashMap<String,Rec> . Pasa por todos tus objetos Rec . Para cada uno, si la tag ya existe como clave en HashMap , entonces compare los dos y decida cuál conservar. Si no, entonces colóquelo.

Cuando haya terminado, el método HashMap.values() le dará todos sus objetos Rec únicos.


Si no te importa mezclar los datos (es decir, tienes una pequeña lista de objetos pequeños), puedes hacer esto:

private List<T> deDupe(List<T> thisListHasDupes){ Set<T> tempSet = new HashSet<T>(); for(T t:thisListHasDupes){ tempSet.add(t); } List<T> deDupedList = new ArrayList<T>(); deDupedList.addAll(tempSet); return deDupedList; }

Recuerde que las implementaciones de Set van a querer un operador de iguales coherente y válido. Entonces, si tienes un objeto personalizado, asegúrate de que se haya solucionado.