In TreeSet, Sortierung & Einzigartigkeit des eigenen Objekte auf der Grundlage verschiedener Eigenschaften
Unten ist mein Schüler Klasse
class Student implements Comparable {
String name;
int rollNo;
@Override
public int compareTo(Object obj) {
return ((Student)obj).name.compareTo(this.name);
}
}
Letzte änderung:, aber immer noch nicht das richtige Ergebnis
@Override
public int compareTo(Object obj) {
Student s = (Student) obj;
if (name.equals(s.name)) { //achieving uniqueness
return 0;
} else {
if (rollNo < s.rollNo) {
return -1;
} else if (rollNo > s.rollNo) {
return 1;
} else {
//this makes `name` the second ordering option.
//names don't equal here
return name.compareTo(s.name);
}
}
}
Wenn ich create object von TreeSet<Student> ich bin immer sortierte Liste von Student-Objekten basierend auf eindeutigen Namen & bestellt von name auch.
Aber ich brauche einzigartige student-name " in mein TreeSet<Student> mit der Bestellung von Schüler-rollNo.
Ist es möglich, mit Komparator? Kann mir keiner helfen, Jeder Vorschlag ist willkommen.
Danke.
UPDATE: hier ist das vollständige Programm:
public class Student implements Comparable {
int rollNo;
String name;
Student(String n,int rno) {
rollNo=rno;
name=n;
}
/**
* @param args
*/
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<Student>();
ts.add(new Student("bbb",2));
ts.add(new Student("aaa",4));
ts.add(new Student("bbb",2));
ts.add(new Student("ccc",3));
ts.add(new Student("aaa",1));
ts.add(new Student("bbb",2));
ts.add(new Student("bbb",5));
System.out.println(ts);
}
@Override
public int compareTo(Object obj) {
Student s = (Student) obj;
if (name.equals(s.name)) { //achieving uniqueness
return 0;
} else {
if (rollNo < s.rollNo) {
return -1;
} else if (rollNo > s.rollNo) {
return 1;
} else {
//this makes `name` the second ordering option.
//names don't equal here
return name.compareTo(s.name);
}
}
}
@Override
public String toString() {
return name + rollNo;
}
}
Update:2: Danke Euch allen für Eure Vorschläge, ich brauche noch einige mehr 🙂
/*
* Actual scenario is having different properties,
* So here I am just relating my actual scenario with Student class
*/
class Student implements Comparable {
//sorting required on rollNo
int rollNo;
//Unique name is required
String name;
Student(String n, int rno) {
rollNo = rno;
name = n;
}
/**
*
* @param args
*/
public static void main(String[] args) {
TreeSet<Student> tsName = new TreeSet<Student>();
//here by default, order & uniqueness by name only
tsName.add(new Student("ccc", 2));
tsName.add(new Student("aaa", 4));
tsName.add(new Student("ddd", 1));
tsName.add(new Student("bbb", 3));
tsName.add(new Student("ddd", 5));
//output: aaa:4, bbb:3, ccc:2, ddd:1
System.out.println(tsName);
//creating new comparator for student RollNo
TreeSet<Student> tsRollNo = new TreeSet<Student>(new Comparator<Student>() {
public int compare(Student stud1, Student stud2) {
return new Integer(stud1.rollNo).compareTo(stud2.rollNo);
}
});
tsRollNo.addAll(tsName);
System.out.println(tsRollNo);
//now got the desire output: ddd:1, ccc:2, bbb:3, aaa:4
}
public boolean equals(Object obj) {
//internally not used to check equality while adding objects
//in TreeSet
System.out.println("equals() for " + this + " & " + ((Student) obj));
return false;//return false/true doesn't make any sense here
}
@Override
public int compareTo(Object obj) {
Student s = (Student) obj;
//internally inside TreeSet, compareTo is used to decide
//whether two objects are equal or not,
//i.e. compareTo will return 0 for same object(here student name)
System.out.println("compareTo() for " + this + " & " + ((Student) obj));
//achieving uniqueness
return name.compareTo(s.name);
}
@Override
public String toString() {
return name + ":" + rollNo;
}
}
AUSGABE:
compareTo() for aaa:4 & ccc:2
compareTo() for ddd:1 & ccc:2
compareTo() for bbb:3 & ccc:2
compareTo() for bbb:3 & aaa:4
compareTo() for ddd:5 & ccc:2
compareTo() for ddd:5 & ddd:1
[aaa:4, bbb:3, ccc:2, ddd:1]
[ddd:1, ccc:2, bbb:3, aaa:4]
Freunde, was auch immer ich habe durch die Verwendung von zwei Komparatoren, Ist es möglich,
das gleiche zu erreichen, während das hinzufügen der Objekte ??
Ich kann nicht Hinzufügen, Elemente & dann mit neu Komparator zum erreichen der gewünschten Reihenfolge.
Ich bin die Manipulation von tausenden von Werten, so betrachten müssen, die Leistung auch.
- ja, aber intern TreeSet don ' T care für die equals () - & hashCode()
- Ist es wichtig, dass, wenn der name nicht eindeutig ist, den Schüler mit der höchsten oder niedrigsten rollNo ist Links?
- Ich verstehe immer noch nicht, welche Art von Ergebnis Sie erwarten. Können Sie bitte geben Sie die erwartete Reihenfolge der Schüler in deinem Beispiel?
TreeSet
definitiv kümmert sich intern überequals()
undhashCode()
. Lesen Sie die Dokumentation: download.oracle.com/javase/6/docs/api/java/util/TreeSet.html- Welches Verhalten wollen Sie im Falle einer doppelten student name? Still abwerfen? Bericht?
- vielen Dank für Ihre Antwort, die ich geschrieben habe, Update2 in Frage, können Sie bitte überprüfen, dass.
- vielen Dank für Ihre Antwort, die ich geschrieben habe, Update2 in Frage, können Sie bitte überprüfen, dass.
- Sie benutzen Sie bitte 01010-Taste anstelle von HTML,Es würde damit der code lesbar bleibt
- Wenn Sie fügen Sie mehrere "Schüler" mit diferent rollNo, Sie halten nur der erste in Ihrer Gruppe, ist es das ?
TreeSet
Komparatoren sollten konsistent mit equals(). TreeSet nicht mit equals() oder hashCode() selbst. Aus den docs, die Sie zitiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
in
TreeSet
wird Es mit Komparator, während das hinzufügen von Elementen zu Sortieren und einzigartige check,nun das problem ist, wenn Sie verwenden Komparator für roll-Nein, Sie haben es sortiert von roll keine und einzigartigen roll-nos zu. Sie können nicht beide zusammen in treeset.
Ich würde vorschlagen, Sie gehen für.
TreeSet
hier konzentrieren Sie sich über doppelte EntfernungArrayList
und Sortieren Sie in beliebiger Reihenfolge Sie wollenequals
undhashcode
und für die Sortierungcomparator
Bestellung
Den Antwort von @ralph sich auf die Verwendung eines
TreeSet
mit einer vorgegebenen Komparator-gut ist, dass die Verwendung.Design
Sollten Sie wickeln Ihr Konzept einer "Schüler-Datenbank" innerhalb einer Klasse, entlarvt und dokumentiert die richtigen Verhaltensweisen, eher als nur mit einem raw-Kollektion. Wenn die Beschaffung von Listen der Studierenden, insbesondere Bestellungen ist eine design-Anforderung, setzen Methoden (vielleicht Rückkehr
Iterable<Student>
dass Sie das sagen. Hinter den kulissen, die Sie tun können, eine Vielzahl von Dingen in Abhängigkeit von der Nutzung Muster:Set
s und oderMaps
Sortierung/Indizierung Studenten durch die Felder von Interesse.Arrays.sort()
und einen bestimmtenComparator
.Beispiel....
Einzigartigkeit
Müssen Sie zum überschreiben
equals()
undhashCode()
auf IhreStudent
Klasse, zu vergleichen nur der student Namen. Dann erhalten Sie Einzigartigkeit (im hintergrund) in IhreTreeSet
. Natürlich, wenn Sie dies tun, werden Sie brauchen, um code defensiv zu überprüfen, um zu sehen, obstudentSet.contains(newStudent)
vor dem einsetzennewStudent
, damit Sie WISSEN, ob Sie haben ein Duplikat ist oder nicht.In diesem Ort, dann code einfügen, student Aussehen kann:
Ihre treeset ist dann voll von Studenten, deren Namen eindeutig sind, und die add-operation meldet einen Fehler, falls nicht. (Eine Ausnahme ist nur ein möglicher Weg, und nur angemessen, wenn das hinzufügen von einem Schüler mit einem doppelten Namen ist TATSÄCHLICH ein außergewöhnlicher Zustand, es aber nicht sagen.)
Können Sie initialisieren ein neues TreeSet mit einem anderen Komparator. So alle Sie tun müssen, ist schreiben eine neue Komparator (implements java.util.Komparator-Schnittstelle), verwenden Sie diese comparator initialisiert ein neues TreeSet und fügen Sie dann auf alle Schüler, um das set.
Jeder Baum Legen kann seine eigenen comparator für die Sortierung, wenn kein comparator angegeben ist, dann wird der Baum Gesetzt, nutzt die Natürliche Reihenfolge der set-Elemente.
Hinzugefügt
Wenn Sie nur den Namen uniqe Studenten, dann haben Sie zwei Möglichkeiten:
Etwas wie dieses:
Sorry für zu spät hier, hier ist eine elegante Lösung: