Doppelte Datensätze aus ArrayList entfernen: Unterschied zwischen den Versionen
K |
K |
||
Zeile 110: | Zeile 110: | ||
100 abc 200 1000 ghi 0 | 100 abc 200 1000 ghi 0 | ||
− | [[Kategorie:Java]] | + | [[Kategorie:Tutorials (Java)]] |
[[Kategorie:Java-Codeschnipsel]] | [[Kategorie:Java-Codeschnipsel]] |
Version vom 28. März 2018, 09:04 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