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.