Bonjour. C'est Kecho. ** Utilisez-vous TreeSet? ** ** Je l'ai vu pour la première fois aujourd'hui. Avez-vous déjà utilisé un HashSet ou TreeMap similaire?
C'est une classe qui n'autorise pas la duplication et qui trie et conserve lors de l'ajout. C'est une classe qui semble être utile dans la programmation compétitive.
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;
}
}
J'ai créé les champs id et name, le constructeur et l'accesseur.
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();
}
Oui, je vais essayer.
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)
Vous avez une erreur.
Vous lancez une ClassCastException. Je suis en colère que le produit ne puisse pas être converti en comparable Le lieu d'occurrence est lorsque vous essayez d'ajouter à TreeSet.
Je n'ai pas à le lancer ... Je pense, mais cela est nécessaire pour TreeSet.
TreeSet a le concept d'ordre. Lors de l'ajout à un TreeSet, vous devez décider de l'ordre pour déterminer où le conserver. Lorsque j'ai créé moi-même la classe Product, j'ai eu une erreur car je n'ai pas spécifié "comment comparer les objets Product".
Plus précisément, il implémente l'interface Comparable.
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;
}
}
Oui, j'ai implémenté et remplacé la méthode compareTo.
id:1, name:kechong
id:2, name:me
id:3, name:you
Oui, ça a l'air bien!
Cette fois, j'ai implémenté l'interface Comparable dans la classe Product. Cependant, lors de l'instanciation de TreeSet, la même sortie peut être obtenue en spécifiant ce qui suit dans l'argument du constructeur.
Set<Product> tree = new TreeSet<>(Comparator.comparing(Product::getId));
Cela permet de déterminer l'ordre en donnant une méthode de comparaison au côté TreeSet.
Si vous souhaitez ajouter votre propre objet à TreeSet, vous devez effectuer l'une des opérations suivantes: -Implémenter une interface comparable avec votre propre objet -Spécifier la méthode de comparaison dans l'argument constructeur de TreeSet
Recommended Posts