[JAVA] Verwendung von TreeSet

Einführung

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?

Was ist TreeSet?

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.

Versuchen Sie es mit

Erstellen Sie zunächst ein Objekt, das Sie zu TreeSet hinzufügen möchten

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.

Fügen Sie dann eine Instanz hinzu

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.

Was für ein Fehler?

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.

Warum versuchst du zu besetzen?

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.

Fügen Sie das Konzept des Vergleichs hinzu

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.

Wenn Sie es erneut ausführen ...

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

Ja, es sieht gut aus!

Apropos

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.

Zusammenfassung

Wenn Sie TreeSet ein eigenes Objekt hinzufügen möchten, müssen Sie einen der folgenden Schritte ausführen:

Recommended Posts

Verwendung von TreeSet
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von java.util.logging
Verwendung der Karte
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
Verwendung der Ketten-API
[Java] Verwendung von Map
Verwendung der Warteschlange mit Priorität
[Rails] Verwendung von Enum
Verwendung von Java Optional
Verwendung von JUnit (Anfänger)
Verwendung von Ruby return
[Rails] Verwendung von Enum
Verwendung von @Builder (Lombok)
Verwendung der Java-Klasse
Wie man Big Decimal benutzt
[Java] Verwendung von removeAll ()
Verwendung von String [] args
Verwendung von Rails Join
Verwendung von Java Map
Ruby: Wie man Cookies benutzt
Verwendung von abhängigen :: zerstören
Verwendung von Eclipse Debug_Shell
Verwendung von Apache POI
[Rails] Verwendung der Validierung
Verwendung von Java-Variablen
[Rails] So verwenden Sie authenticate_user!
Verwendung von GC Viewer
Wie man Lombok jetzt benutzt
[Erstellen] Verwendung von JUnit
[Schienen] Verwendung von Scope
Verwendung der link_to-Methode
[Rails] Wie man Edelstein "devise" benutzt
Wie man Lombok im Frühling benutzt
Verwendung von StringBurrer und Arrays.toString.
Verwendung des Arrays (persönliches Memorandum)
Verwendung von HttpClient (Get) von Java
Verwendung der include? -Methode
Verwendung der Methode form_with
[Rails] Verwendung von Flash-Nachrichten