Doppelte Datensätze aus ArrayList entfernen: Unterschied zwischen den Versionen
Zeile 1: | Zeile 1: | ||
− | Manchmal hat man Listen mit doppelten oder mehrfachen Einträgen. Wenn man keine doppelten Einträge in einer {{JAPI|Collection}} zulassen möchte, verwendet man statt einer {{JAPI|List}} ein {{JAPI|Set}}. | + | 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 {{JAPI|Collection}} zulassen möchte, verwendet man statt einer {{JAPI|List}} ein {{JAPI|Set}}. | ||
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. | ||
Zeile 55: | Zeile 60: | ||
} | } | ||
</code=java> | </code=java> | ||
+ | |||
+ | 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: | ||
+ | 1 100 abc def 10 200 1000 ghi 0 | ||
Manchmal möchte man aber auch Duplikate markieren, bspw. in einem TableModel. | Manchmal möchte man aber auch Duplikate markieren, bspw. in einem TableModel. | ||
Zeile 98: | Zeile 106: | ||
} | } | ||
</code=java> | </code=java> | ||
+ | |||
+ | Und wieder testen wir die eingangs gezeigte Liste und bekommen folgende Ausgabe: | ||
+ | 100 abc 200 1000 ghi 0 | ||
[[Kategorie:Java]] | [[Kategorie:Java]] | ||
[[Kategorie:Java-Codeschnipsel]] | [[Kategorie:Java-Codeschnipsel]] |
Version vom 1. Februar 2018, 08:46 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.
<code=java> 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; }
} </code=java>
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.
<code=java> [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; }
</code=java>
Und wieder testen wir die eingangs gezeigte Liste und bekommen folgende Ausgabe:
100 abc 200 1000 ghi 0