Doppelte Datensätze aus ArrayList entfernen: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
Zeile 8: Zeile 8:
 
Sets lassen von Hause aus keine doppelten Einträge zu. Dieses Verhalten kann man zur Lösung des Problems dieses Themas benutzen.
 
Sets lassen von Hause aus keine doppelten Einträge zu. Dieses Verhalten kann man zur Lösung des Problems dieses Themas benutzen.
  
<code=java>
+
<syntaxhighlight lang="java">
 
import java.util.ArrayList;
 
import java.util.ArrayList;
 
import java.util.LinkedHashSet;
 
import java.util.LinkedHashSet;
Zeile 59: Zeile 59:
 
   }
 
   }
 
}
 
}
</code=java>
+
</syntaxhighlight>
  
 
Führt man nun ein Programm aus, in welchem unsere Klasse <code>CollectionUtil</code> eingesetzt wurde, erhalten wir bei Eingabe eingangs gezeigten Liste folgende bereinigte Ausgabe:
 
Führt man nun ein Programm aus, in welchem unsere Klasse <code>CollectionUtil</code> eingesetzt wurde, erhalten wir bei Eingabe eingangs gezeigten Liste folgende bereinigte Ausgabe:
Zeile 68: Zeile 68:
 
...oder gänzlich entfernen, so dass es keine Objekte in einer Liste mehr gibt, die zu Duplikaten geführt haben.
 
...oder gänzlich entfernen, so dass es keine Objekte in einer Liste mehr gibt, die zu Duplikaten geführt haben.
  
<code=java>
+
<syntaxhighlight lang="java">
 
[import ...]
 
[import ...]
 
import java.util.HashSet;
 
import java.util.HashSet;
Zeile 105: Zeile 105:
 
       return list;
 
       return list;
 
   }
 
   }
</code=java>
+
</syntaxhighlight>
  
 
Und wieder testen wir die eingangs gezeigte Liste und bekommen folgende Ausgabe:
 
Und wieder testen wir die eingangs gezeigte Liste und bekommen folgende Ausgabe:

Version vom 9. März 2018, 18:49 Uhr

Manchmal hat man Listen mit doppelten oder mehrfachen Einträgen.

Eine Beispielausgabe einer solchen Liste:

1 100 abc def 10 1 200 def 1000 def ghi 10 0 

Wenn man keine doppelten Einträge in einer Collection zulassen möchte, verwendet man statt einer List ein Set.

Sets lassen von Hause aus keine doppelten Einträge zu. Dieses Verhalten kann man zur Lösung des Problems dieses Themas benutzen.

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * CollectionUtil bietet Methoden zur Umwandlung und Behandlung von
 * Collection-Typen an.
 *
 * @autor Gernot Segieth
 */
public class CollectionUtil {

   /**
    * Entfernt doppelte Einträge aus der übergebenen Liste.
    *
    * @param list eine Liste mit doppelten Einträgen
    * @return die um doppelte Einträge bereinigte Liste
    */
   public static List<?> removeDuplicate(List<?> list) {
      Set<?> set = transformListIntoSet(list);
      List<?> listWithoutDuplicate = transformSetIntoList(set);
      return listWithoutDuplicate;
   }

   /**
    * Wandelt eine List in ein Set um.
    *
    * @param list die Liste, die in ein Set verwandelt werden soll
    * @return der Ergebnis-Typ, ein Set
    */
   public static Set<?> transformListIntoSet(List<?> list) {
      Set<Object> set = new LinkedHashSet<>();
      set.addAll(list);
      return set;
   }

   /**
    * Wandelt ein Set in eine List um.
    *
    * @param set das Set, das in eine List verwandelt werden soll
    * @return der Ergebnis-Typ, eine List
    */
   public static List<?> transformSetIntoList(Set<?> set) {
      List<Object> list = new ArrayList<>();
      list.addAll(set);
      return list;
   }
}

Führt man nun ein Programm aus, in welchem unsere Klasse CollectionUtil eingesetzt wurde, erhalten wir bei Eingabe eingangs gezeigten Liste folgende bereinigte Ausgabe:

1 100 abc def 10 200 1000 ghi 0 

Manchmal möchte man aber auch Duplikate markieren, bspw. in einem TableModel.

...oder gänzlich entfernen, so dass es keine Objekte in einer Liste mehr gibt, die zu Duplikaten geführt haben.

[import ...]
import java.util.HashSet;

[...]


   /**
    * Entfernt doppelte Einträge aus der übergebenen Liste.
    * Es werden alle Objekte entfernt, die zu Duplikaten geführt haben.
    *
    * @param list eine Liste mit doppelten Einträgen
    * @return die um alle doppelten Einträge bereinigte Liste
    */
   public static List<?> removeAllDuplicate(List<?> list) {
      Set<Integer> duplicateSet = new HashSet<>();

      for(int i = 0, j = list.size(); i < j; i++) { //komplette Liste durchlaufen
         Object o1 = list.get(i);                   //Objekt an Index-Position holen
         for (int x = i + 1; x < j; x++) {          //Folgeeinträge durchlaufen
            Object o2 = list.get(x);
            if (o1.equals(o2)) {                    //Bei Objektidentität deren Indizes im Set ablegen
                duplicateSet.add(i);
                duplicateSet.add(x);
            }
         }
      }

      List<Integer> indexList = new ArrayList<>(duplicateSet);
      Collections.sort(indexList);                  //Liste nach Indizes sortieren
      Collections.reverse(indexList);               //größte Indizes zuerst in der Liste
      for(int i : indexList) { 
            list.remove(i);                         //Objekte aus Liste "von hinten nach vorne" löschen
      }

      return list;
   }

Und wieder testen wir die eingangs gezeigte Liste und bekommen folgende Ausgabe:

100 abc 200 1000 ghi 0