Für jedes ArrayList<Widget>
, fügen jedes Element auf einem Set<Widget>
(HashSet
TreeSet
oder, je nachdem, ob sie in irgendeiner Weise zu bestellen, oder hashable sind) unter Verwendung von addAll
. Sets enthalten standardmäßig keine Duplikate.
Sie können diese Set
wieder in eine (Array)List
konvertieren, wenn Sie am Ende benötigen.
Hinweis müssen Sie hashCode
für Ihre Widget
Klasse implementieren, wenn Sie einen HashSet
verwenden entscheiden, aber wenn Sie equals,
ein außer Kraft gesetzt haben, sollten Sie dies doch tun.
Edit: Hier ist ein Beispiel:
//Either the class itself needs to implement Comparable<T>, or a similar
//Comparable instance needs to be passed into a TreeSet
public class Widget implements Comparable<Widget>
{
private final String name;
private final int id;
Widget(String n, int i)
{
name = n;
id = i;
}
public String getName()
{
return name;
}
public int getId()
{
return id;
}
//Something like this already exists in your class
@Override
public boolean equals(Object o)
{
if(o != null && (o instanceof Widget)) {
return ((Widget)o).getName().equals(name) &&
((Widget)o).getId() == id;
}
return false;
}
//This is required for HashSet
//Note that if you override equals, you should override this
//as well. See: http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java
@Override
public int hashCode()
{
return ((Integer)id).hashCode() + name.hashCode();
}
//This is required for TreeSet
@Override
public int compareTo(Widget w)
{
if(id < w.getId()) return -1;
else if(id > w.getId()) return 1;
return name.compareTo(w.getName());
}
@Override
public String toString()
{
return "Widget: " + name + ", id: " + id;
}
}
Wenn Sie eine TreeSet
verwenden möchten, aber nicht wollen, Comparable<T>
auf Ihrer Widget
Klasse implementieren, können Sie das Gerät selbst ein Comparator
Objekt geben:
private Set<Widget> treeSet;
....
treeSet = new TreeSet<Widget>(new Comparator<Widget>() {
public int compare(Widget w1, Widget w2)
{
if(w1.getId() < w2.getId()) return -1;
else if(w1.getId() > w2.getId()) return 1;
return w1.getName().compareTo(w2.getName());
}
});
Wow dank @Yuushi (+1) - werde ich eine Laufzeitausnahme, wenn ich versuche, eine Betrogene zu dem Satz hinzufügen? Oder ignoriert Java einfach den hinzugefügten Dupe (was ich will). Danke noch einmal! – IAmYourFaja
Java ignoriert einfach das hinzugefügte Duplikat –
@IamYourFaja Es ignoriert einfach den Betrogenen. – Yuushi