TreeMap ist eine Klasse des Java Collection Framework, die die NavigableMap-Schnittstelle implementiert. Es speichert die Elemente der Karte in einer Baumstruktur und bietet eine effiziente Alternative zum Speichern von Schlüssel-Wert-Paaren in sortierter Reihenfolge. Bitte beachten Sie, dass beim Erstellen eines TreeMap-Objekts die Comparable-Schnittstelle oder die Comparator-Schnittstelle verwendet werden muss, damit wir die Sortierreihenfolge seiner Elemente beibehalten können. Andernfalls stoßen wir auf eine java.lang.ClassCastException. In diesem Artikel erklären wir, wie Sie die Schnittstellen Comparable und Comparator verwenden, um ClassCastException-Probleme in TreeMap zu beheben
Lassen Sie uns die Diskussion mit einem Beispielprogramm beginnen, das uns ClassCastException in TreeMap zeigt.
Die chinesische Übersetzung vonIm folgenden Beispiel werden wir versuchen, ein benutzerdefiniertes Klassenobjekt zu einer TreeMap hinzuzufügen, ohne die Schnittstellen Comparable und Comparator zu verwenden, um die Situation darzustellen, wenn der Java-Compiler eine java.lang.ClassCastException auslöst.
import java.util.*; public class TrMap { String item; int price; TrMap(int price, String item) { // this keyword shows these variables belong to constructor this.item = item; this.price = price; } // method for converting object into string public String toString() { return "Item: " + item + ", " + "Price: " + price; } public static void main(String[] args) { // Declaring collection TreeMap TreeMap<TrMap, Integer> obj = new TreeMap<>(); // Adding object to the obj map obj.put(new TrMap(495, "TShirt"), 1); obj.put(new TrMap(660, "Shirt"), 2); // printing details obj map System.out.println("Elements of the map: " + obj); } }
Exception in thread "main" java.lang.ClassCastException: class TrMap cannot be cast to class java.lang.Comparable (TrMap is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap') at java.base/java.util.TreeMap.compare(TreeMap.java:1569) at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776) at java.base/java.util.TreeMap.put(TreeMap.java:785) at java.base/java.util.TreeMap.put(TreeMap.java:534) at TrMap.main(TrMap.java:18)
Beginnen wir die Diskussion mit der Einführung der Comparable-Schnittstelle
Diese Schnittstelle ist sehr nützlich, wenn wir benutzerdefinierte Objekte in natürlicher Reihenfolge sortieren möchten. Es sortiert beispielsweise Zeichenfolgen in lexikografischer Reihenfolge und Zahlen in numerischer Reihenfolge. Diese Schnittstelle ist im Paket „java.lang“ verfügbar. Im Allgemeinen stehen uns die in diesem Paket definierten Klassen und Schnittstellen standardmäßig zur Verfügung, sodass kein expliziter Import dieses Pakets erforderlich ist.
class nameOfclass implements Comparable<nameOfclass>
Hier ist „class“ das Schlüsselwort zum Erstellen einer Klasse und „implements“ das Schlüsselwort zum Aktivieren der von der Schnittstelle bereitgestellten Funktionen.
Die Comparable-Schnittstelle definiert nur eine einzige Methode namens „CompareTo“, die überschrieben werden kann, um die Sammlung von Objekten zu sortieren. Sie gibt die Möglichkeit, die Objekte einer Klasse mit sich selbst zu vergleichen. Sie gibt 0 zurück, wenn „dieses“ Objekt gleich ist zum übergebenen Objekt, ein positiver Wert, wenn „dieses“ Objekt größer ist, andernfalls ein negativer Wert.
compareTo(nameOfclass nameOfobject);
Das folgende Beispiel demonstriert die Verwendung von Comparable bei der Behebung von ClassCastException.
Erstellen Sie eine Klasse „TrMap“, die die Comparable-Schnittstelle implementiert. Deklarieren Sie innerhalb der Klasse zwei Variablen und definieren Sie einen Konstruktor mit zwei Parametern vom Typ „string“ und den doppelten Werten „item“ und „price“.
Im weiteren Verlauf werden wir die Methode „toString()“ verwenden, um die Daten des Objekts in einen String umzuwandeln. Definieren Sie dann die Methode „compareTo“ und übergeben Sie ein Objekt der Klasse „TrMap“ als Parameter, um das Objekt „this“ mit dem neu erstellten Objekt zu vergleichen
Deklarieren Sie nun in der Methode main() ein Objekt der TreeMap-Klasse mit dem Namen „obj“ und speichern Sie die Objektdetails mithilfe der integrierten Methode „put()“ darin. „Artikel“ ist der Schlüssel und der entsprechende Wert ist „Preis“.
Verwenden Sie abschließend die Methode „keySet()“ in einer for-each-Schleife, um den mit dem Schlüssel verknüpften Wert abzurufen und auszugeben.
import java.util.*; import java.lang.*; public class TrMap implements Comparable<TrMap> { String item; int price; TrMap(String item, int price) { // this keyword shows these variables belong to constructor this.item = item; this.price = price; } // method for converting object into string public String toString() { return "Item: " + item + ", " + "Price: " + price; } public String getName() { return this.item; } // overriding method public int compareTo(TrMap comp) { return this.item.compareTo(comp.item); } public static void main(String[] args) { // Declaring collection TreeMap TreeMap<String, TrMap> obj = new TreeMap<>(); // Adding object to the obj map TrMap obj1 = new TrMap("TShirt", 495); obj.put(obj1.getName(), obj1); TrMap obj2 = new TrMap("Shirt", 660); obj.put(obj2.getName(), obj2); TrMap obj3 = new TrMap("Kurti", 455); obj.put(obj3.getName(), obj3); // printing details obj map System.out.println("Elements of the map: "); for (String unKey : obj.keySet()) { System.out.println(obj.get(unKey)); } } }
Elements of the map: Item: Kurti, Price: 455 Item: Shirt, Price: 660 Item: TShirt, Price: 495
Lassen Sie uns zunächst die Comparator-Schnittstelle vorstellen.
Wie der Name schon sagt, wird es verwendet, um etwas zu vergleichen. In Java ist Comparator eine Schnittstelle zum Sortieren benutzerdefinierter Objekte. Wir können unsere eigene Logik schreiben, um die angegebenen Objekte in der integrierten Methode namens 'compare()' zu sortieren. Diese Methode akzeptiert zwei Objekte als Parameter und gibt einen ganzzahligen Wert zurück. Anhand dieses ganzzahligen Werts bestimmt der Komparator, welches Objekt größer ist
class nameOfComparator implements Comparator< TypeOfComparator >() { compare( type object1, type object2 ) { // logic for comparison } }
Das folgende Beispiel demonstriert die Verwendung von Comparator beim Beheben von ClassCastException.
Importieren Sie zunächst das Paket „java.util“, damit wir TreeSet verwenden können
Erstellen Sie eine Klasse namens „TrMap“. Deklarieren Sie innerhalb der Klasse zwei Variablen und definieren Sie einen Konstruktor, der über zwei Parameter „item“ und „price“ verfügt, die vom Typ „String“ bzw. „Integer“ sind.
Im weiteren Verlauf werden wir die Methode „toString()“ verwenden, um die Daten des Objekts in einen String umzuwandeln
Dann definieren Sie eine andere Klasse „Comp“, die die Comparator-Schnittstelle implementiert, und verwenden Sie darin die Methode „compare()“, um die TreeMap in aufsteigender Reihenfolge zu sortieren.
Erstellen Sie in der Methode „main()“ eine TreeMap-Sammlung, indem Sie eine Instanz der Klasse „Comp“ zum Sortieren übergeben
Abschließend verwenden Sie die Methode „put()“, um einige Elemente in der TreeMap-Sammlung zu speichern und dann das Ergebnis auszudrucken.
import java.util.*; class TrMap { String item; int price; TrMap(int price, String item) { // this keyword shows these variables belong to constructor this.item = item; this.price = price; } // method for converting object into string public String toString() { return "Item: " + item + ", " + "Price: " + price; } public String getName() { return this.item; } } // use of comparator interface class Comp implements Comparator<TrMap> { // logic to sort public int compare(TrMap i, TrMap j) { if(i.price > j.price) { return 1; } else { return -1; } } } public class Example2 { public static void main(String[] args) { // Declaring collection TreeMap TreeMap<TrMap, Integer> obj = new TreeMap<>(new Comp()); // Adding object to the obj map obj.put(new TrMap(495, "TShirt"), 1); obj.put(new TrMap(660, "Shirt"), 2); // printing details obj map System.out.println("Elements of the map: " + obj); } }
Elements of the map: {Item: TShirt, Price: 495=1, Item: Shirt, Price: 660=2}
在本文中,我们首先定义了TreeMap类,然后介绍了TreeMap中的ClassCastException。在下一部分中,我们讨论了可以帮助解决这个ClassCastException的Comparator和Comparable接口。然后,我们看到了三个示例程序,展示了ClassCastException以及如何修复这个异常。
Das obige ist der detaillierte Inhalt vonWie löse ich das java.lang.ClassCastException-Problem bei der Verwendung von TreeMap in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!