[JAVA] Comment utiliser TreeSet

introduction

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?

Qu'est-ce que TreeSet?

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.

Essayez d'utiliser

Tout d'abord, créez un objet à ajouter à TreeSet

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.

Ensuite, ajoutez une instance

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.

Quel genre d'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.

Pourquoi tu essaies de lancer

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".

Ajouter le concept de comparaison

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.

Si vous l'exécutez à nouveau ...

id:1, name:kechong
id:2, name:me
id:3, name:you

Oui, ça a l'air bien!

Au fait

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.

Résumé

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

Comment utiliser TreeSet
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser l'API Chain
[Java] Comment utiliser Map
Comment utiliser Queue avec priorité
[Rails] Comment utiliser enum
Comment utiliser java Facultatif
Comment utiliser JUnit (débutant)
Comment utiliser le retour Ruby
[Rails] Comment utiliser enum
Comment utiliser @Builder (Lombok)
Comment utiliser la classe Java
Comment utiliser Big Decimal
[Java] Comment utiliser removeAll ()
Comment utiliser String [] args
Comment utiliser la jonction de rails
Comment utiliser Java Map
Ruby: Comment utiliser les cookies
Comment utiliser Dependant :: Destroy
Comment utiliser Eclipse Debug_Shell
Comment utiliser Apache POI
[Rails] Comment utiliser la validation
Comment utiliser les variables Java
[Rails] Comment utiliser authenticate_user!
Comment utiliser GC Viewer
Comment utiliser Lombok maintenant
[Création] Comment utiliser JUnit
[Rails] Comment utiliser Scope
Comment utiliser la méthode link_to
[Rails] Comment utiliser la "devise" des gemmes
Comment utiliser Lombok au printemps
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser le tableau (mémorandum personnel)
Comment utiliser HttpClient de Java (Get)
Comment utiliser la méthode include?
Comment utiliser la méthode form_with
[Rails] Comment utiliser les messages flash