Hallo. Es ist Kecho. ** Verwenden Sie TreeSet? ** **. Ich habe es heute zum ersten Mal gesehen. Haben Sie jemals ein ähnliches HashSet oder eine ähnliche TreeMap verwendet?
Es ist eine Klasse, die keine Duplizierung zulässt und beim Hinzufügen sortiert und beibehält. Es ist eine Klasse, die in der Wettbewerbsprogrammierung nützlich zu sein scheint.
class Product {
private int id;
private String name;
public Product() {
}
public Product(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
}
Ich habe die ID- und Namensfelder, den Konstruktor und den Accessor erstellt.
Set<Product> tree = new TreeSet<>();
tree.add(new Product(1, "kechong"));
tree.add(new Product(2, "me"));
tree.add(new Product(3, "you"));
for (Product product : tree) {
System.out.print("id:" + product.getId() + ", ");
System.out.print("name:" + product.getName());
System.out.println();
}
Ja, ich werde es versuchen.
Exception in thread "main" java.lang.ClassCastException: Product cannot be cast to java.base/java.lang.Comparable
at java.base/java.util.TreeMap.compare(TreeMap.java:1291)
at java.base/java.util.TreeMap.put(TreeMap.java:536)
at java.base/java.util.TreeSet.add(TreeSet.java:255)
at Main.main(Main.java:26)
Du hast einen Fehler bekommen.
Sie lösen eine ClassCastException aus. Ich bin wütend, dass das Produkt nicht auf Vergleichbar umgestellt werden kann. Der Ort des Auftretens ist, wenn Sie versuchen, zu TreeSet hinzuzufügen.
Ich muss es nicht besetzen ... Ich denke, aber das ist für TreeSet notwendig.
TreeSet hat das Konzept der Ordnung. Beim Hinzufügen zu einem TreeSet müssen Sie die Reihenfolge festlegen, um zu bestimmen, wo es gespeichert werden soll. Als ich die Produktklasse selbst erstellt habe, ist eine Fehlermeldung aufgetreten, da ich nicht angegeben habe, wie Produktobjekte verglichen werden sollen.
Insbesondere wird die Schnittstelle Comparable implementiert.
class Product implements Comparable<Product> {
private int id;
private String name;
public Product() {
}
public Product(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
@Override
public int compareTo(Product o) {
return this.id - o.id;
}
}
Ja, ich habe die compareTo-Methode implementiert und überschrieben.
id:1, name:kechong
id:2, name:me
id:3, name:you
Ja, es sieht gut aus!
Diesmal habe ich die Comparable-Schnittstelle in der Produktklasse implementiert. Wenn Sie jedoch TreeSet instanziieren, können Sie dieselbe Ausgabe erhalten, indem Sie im Argument des Konstruktors Folgendes angeben.
Set<Product> tree = new TreeSet<>(Comparator.comparing(Product::getId));
Auf diese Weise kann die Reihenfolge bestimmt werden, indem der TreeSet-Seite eine Vergleichsmethode zugewiesen wird.
Wenn Sie TreeSet ein eigenes Objekt hinzufügen möchten, müssen Sie einen der folgenden Schritte ausführen:
Recommended Posts