TreeMap ialah kelas Rangka Kerja Koleksi Java yang melaksanakan antara muka NavigableMap. Ia menyimpan elemen peta dalam struktur pokok dan menyediakan alternatif yang cekap untuk menyimpan pasangan nilai kunci dalam susunan yang disusun. Sila ambil perhatian bahawa semasa mencipta objek TreeMap, seseorang mesti menggunakan antara muka Sebanding atau antara muka Comparator supaya kita boleh mengekalkan susunan isihan unsurnya, jika tidak, kita akan menemui java.lang.ClassCastException. Dalam artikel ini, kami akan menerangkan cara menggunakan antara muka Comparable dan Comparator untuk menyelesaikan isu ClassCastException dalam TreeMap
Mari kita mulakan perbincangan dengan contoh program yang akan menunjukkan kepada kita ClassCastException dalam TreeMap.
Terjemahan bahasa Cina bagiDalam contoh berikut, kami akan cuba menambah objek kelas tersuai pada TreeMap tanpa menggunakan antara muka Comparable dan Comparator untuk menunjukkan situasi apabila pengkompil Java membuang java.lang.ClassCastException.
rreeee Terjemahan bahasa Cina bagiimport 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); } }
Mari mulakan perbincangan dengan memperkenalkan antara muka Setanding
Antara muka ini sangat berguna apabila kita ingin mengisih objek tersuai dalam susunan semula jadi. Contohnya, ia menyusun rentetan dalam susunan leksikografi dan nombor dalam susunan berangka. Antara muka ini tersedia dalam pakej 'java.lang'. Secara amnya, kelas dan antara muka yang ditakrifkan dalam pakej ini tersedia kepada kami secara lalai, jadi tidak perlu mengimport pakej ini secara eksplisit.
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)
Di sini, kelas ialah kata kunci untuk mencipta kelas, dan implement ialah kata kunci untuk mendayakan ciri yang disediakan oleh antara muka.
Antara muka Sebanding mentakrifkan hanya satu kaedah bernama 'CompareTo' yang boleh ditindih untuk mengisih koleksi objek Ia memberikan kuasa untuk membandingkan objek kelas dengan dirinya sendiri kepada objek yang dilalui, nilai positif jika objek 'ini' lebih besar sebaliknya nilai negatif.
class nameOfclass implements Comparable<nameOfclass>
Contoh berikut menunjukkan penggunaan Comparable dalam membetulkan ClassCastException.
Buat kelas 'TrMap' yang melaksanakan antara muka Setanding. Di dalam kelas, isytiharkan dua pembolehubah dan tentukan pembina dengan dua parameter jenis rentetan dan dua 'item' dan 'harga'.
Bergerak lebih jauh, kami akan menggunakan kaedah 'toString()' untuk menukar data objek kepada rentetan. Kemudian, tentukan kaedah 'compareTo' dan lulus objek kelas 'TrMap' sebagai parameter untuk membandingkan objek 'ini' dengan objek yang baru dibuat
Sekarang, dalam kaedah main(), isytiharkan objek kelas TreeMap bernama 'obj' dan simpan butiran objek ke dalamnya menggunakan kaedah terbina bernama 'put()'. 'item' ialah kunci dan nilai yang sepadan ialah 'harga'.
Akhir sekali, gunakan kaedah 'keySet()' dalam gelung untuk setiap untuk mendapatkan dan mencetak nilai yang dikaitkan dengan kunci.
compareTo(nameOfclass nameOfobject);
Mula-mula, mari kita perkenalkan antara muka Pembanding.
Seperti namanya, ia digunakan untuk membandingkan sesuatu. Di Java, Comparator ialah antara muka untuk menyusun objek tersuai. Kita boleh menulis logik kita sendiri untuk mengisih objek yang ditentukan dalam kaedah terbina dalamnya bernama 'compare()'. Kaedah ini menerima dua objek sebagai parameter dan mengembalikan nilai integer. Melalui nilai integer ini, Comparator menentukan objek yang lebih besar
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)); } } }
Contoh di bawah menunjukkan penggunaan Comparator semasa membetulkan ClassCastException.
Mula-mula, import pakej 'java.util' supaya kita boleh menggunakan TreeSet
Buat kelas yang dipanggil 'TrMap'. Di dalam kelas, isytiharkan dua pembolehubah dan tentukan pembina yang mempunyai dua parameter 'item' dan 'harga', iaitu jenis rentetan dan jenis integer masing-masing.
Bergerak lebih jauh, kami akan menggunakan kaedah 'toString()' untuk menukar data objek kepada rentetan
Kemudian, tentukan kelas lain 'Comp' yang melaksanakan antara muka Comparator, dan gunakan kaedah 'compare()' di dalamnya untuk mengisih TreeMap dalam tertib menaik.
Dalam kaedah 'main()', buat koleksi TreeMap dengan menghantar contoh kelas 'Comp' untuk mengisih
Akhir sekali, gunakan kaedah 'put()' untuk menyimpan beberapa elemen ke dalam koleksi TreeMap dan kemudian mencetak hasilnya.
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以及如何修复这个异常。
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan isu java.lang.ClassCastException semasa menggunakan TreeMap dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!