java: Komparator und Treeset Duplikate entfernen
ich habe eine java-Klasse wie folgt
public class A {
private String field1;
private String field2;
//getters, setters but no equals and hashcode
}
sowie eine Liste von Objekten dieser Klasse, ich möchte aus Liste entfernen alle Duplikate Elemente, die den gleichen Feld1 oder der gleichen Feld2, also ich habe 2 Komparatoren
public class Comparator1 implements Comparator<A> {
public int compare(A o1, A o2) {
return o1.getField1().compareToIgnoreCase( o2.getField1() );
}
}
public class Comparator2 implements Comparator<A> {
public int compare(A o1, A o2) {
return o1.getField2().compareToIgnoreCase(o2.getField2());
}
}
damit zu tun, die Aufgabe, die ich verwenden treeset wie
TreeSet<A> ts1 = new TreeSet<A>(new Comparator1())
ts1.addAll(list)
TreeSet<A> ts2 = new TreeSet<A>(new Comparator2())
ts2.addAll(ts1)
list.clear()
list.addAll(ts2)
aber wie kann ich das gleiche tun mit nur einem Komparator und einem treeset ?
Danke für die Hilfe
Update:
Danke an alle für die Antworten, aber nach dem Lesen weiß ich nicht, ob dies der richtige Ansatz für das eigentliche problem.
In meiner realen Fall Feld1 ist wie eine Telefonnummer und Feld2 ist wie ein name.
So will ich nicht zu nennen, die gleiche Telefon-Nummer mehr als einmal (dies ist der erste treeset, entfernt Duplikate) und ich will nicht rufen Sie mehr als einmal mit dem gleichen Namen (die zweite treeset, entfernt Duplikate)
Können Sie die Klasse ändern, aber ich würde gerne wissen, ob diese Vorgehensweise ok ist, zu lösen das eigentliche problem.
Wenn dieser Ansatz richtig ist, bei deiner Frage sehe ich, dass ohne änderung der Klasse nicht möglich ist, die Verwendung von nur einem Komparator
Dank
equals()
und hashCode()
zu A
ist also nicht eine option? Erweiterung A
auch nicht?ich aktualisierte die Frage
InformationsquelleAutor res1 | 2011-04-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht, und es ist mir nicht klar, dass das, was Sie zu tun versuchen ist gut definiert.
Sind Sie sich bewusst, dass Ihre aktuelle Herangehensweise hängt sowohl von der Reihenfolge, in der die Elemente Hinzugefügt werden und ob Sie prüfen, Feld1 oder Feld2 ersten für Duplikate? Stellen Sie sich vor Sie hätten diese Objekte der Klasse A:
Überprüfung Feld1 erste gibt das Ergebnis
[ab]
oder[ab, cd]
je nach Auftrag Hinzugefügt.Überprüfung Feld2 erste gibt das Ergebnis
[cb]
oder[ab, cd]
je nach Auftrag Hinzugefügt.Dies ist ziemlich seltsam Verhalten. Ist es das, was Sie soll? Ich glaube nicht, dass es möglich ist, zu reproduzieren, mit einem einzigen TreeSet und Komparator im Allgemeinen Fall.
Ihre update nicht klären, das problem. Feine vorgeben "a" ist ein name und "c" ist ein name und "b" ist eine Telefon-Nummer und "d" ist eine Telefonnummer. Manchmal mit diesen drei Paaren, die Sie nur rufen "a" bei "b", nie Aufruf von "c" auf allen, und nie, telefonisch unter der Nummer "d" an alle. Ist es das, was Sie soll? Wenn nicht, erklären Sie bitte, was Sie wollen, passieren in dieser situation.
suchen Sie in Ihrer test-Fall ist dies nicht das, was ich will, ich will [ab, cd] als Ergebnis und nicht die [ab].
InformationsquelleAutor rlibby
Können Sie nicht verwenden Sie eine comparator Sortieren nach zwei Kriterien gleichzeitig, so gibt es keinen wirklichen Weg zu gehen, besser als zwei TreeSets in Ihrem Fall. Natürlich, Sie können wickeln Sie Sie in eine Datenstruktur.
(Alternativ könnte man zwei HashMaps, die jeweils einer der strings als Schlüssel - dieser wird im Durchschnitt immer schneller, aber komplizierter zu Programmieren ist.)
InformationsquelleAutor Paŭlo Ebermann
Generische Funktion, die Elemente Hinzugefügt hashset, die Sie einzigartig machen, und dann legen Sie Sie in TreeSet Sortieren. Sie können es verwenden mit:
TreeSet<A> ts1 = getTreeSet(list);
.Dieser Ansatz funktioniert gut für eine Feste Liste.
@BalusC Nein, das meint
equals()
undhashCode()
realisiertA
.Ich wounder wie Sie entschlüsselt zu haben :
A extends Comparable<?>
.Ah ich vermisste, dass ein Teil. Gut, ich habe verstanden, dass die änderung
A
ist keine option. Ich nur don ' T verstehen, wie dieHashSet
notwendig ist, in diesem Beispiel.A
ist nicht deklariert, wiefinal
, so kann erextend
Ein und verwenden Sie es anstelle.Erweiterung
A
beinhaltet mehr änderungen in der Rest des Codes mit Hilfe der Klasse. Wenn es auch intern von einigen 3rd-party-API, dann könnte es nicht eine sinnvolle option sein.InformationsquelleAutor Margus
Wenn Ihre Absicht ist es, zwei Ebenen der Sortierung(zuerst: PhoneNumber und die zweite:Namen), dann können Sie verwenden Sie den folgenden code, wo die Dublettenprüfung wird getan gegen die beiden Felder(Feld1 und Feld2). Wie wir bereits compareTo für sowohl die Felder, es ist nicht erforderlich, um gleich und hashcode. Aber es ist immer gut, die Praxis zu verwenden hashcode und gleich.
}
InformationsquelleAutor Jagadeesh
InformationsquelleAutor shyam sanju