如何在 Java 中使用 TreeMap 时修复 java.lang.ClassCastException?


TreeMap 是 Java 集合框架的一个类,它实现了 NavigableMap 接口。它以树结构存储映射的元素,并提供了一种有效的替代方案,以排序顺序存储键值对。请注意,在创建 TreeMap 对象时,必须使用 Comparable 接口或 Comparator 接口,以便我们可以维护其元素的排序顺序,否则,我们会遇到 java.lang.ClassCastException。在本文中,我们将解释如何使用 Comparable 和 Comparator 接口来修复 TreeMap 中的此 ClassCastException。

修复 TreeMap 中的 java.lang.ClassCastException

让我们从一个示例程序开始讨论,该程序将向我们展示 TreeMap 中的 ClassCastException。

示例 1

在下面的示例中,我们将尝试在没有 Comparable 和 Comparator 接口的情况下将自定义类对象添加到 TreeMap,以表明 Java 编译器会抛出 java.lang.ClassCastException。

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)

如何使用 Comparable 接口修复 java.lang.ClassCastException

让我们从介绍 Comparable 接口开始讨论。

Comparable 接口

当我们希望按其自然顺序对自定义对象进行排序时,此接口很有用。例如,它按字典顺序对字符串进行排序,按数字顺序对数字进行排序。此接口位于 'java.lang' 包中。通常,在此包中定义的类和接口默认情况下可供我们使用,因此无需显式导入此包。

语法

class nameOfclass implements Comparable<nameOfclass>

这里,class 是创建类的关键字,implements 是启用使用接口提供的功能的关键字。

compareTo()

Comparable 接口仅定义了一个名为 'compareTo' 的方法,可以覆盖该方法以对对象集合进行排序。它提供了比较类对象与自身的功能。当“此”对象等于传递的对象时,它返回 0;如果“此”对象更大,则返回正值,否则返回负值。

语法

compareTo(nameOfclass nameOfobject);

示例 2

以下示例演示了在修复 ClassCastException 中使用 Comparable 的方法。

方法

  • 创建一个实现 Comparable 接口的类 'TrMap'。在其中,声明两个变量并定义此类的构造函数以及两个参数 'item' 和 'price',类型分别为字符串和双精度数。

  • 接下来,我们将使用 'toString()' 方法将对象的数据转换为字符串。然后,定义 'compareTo' 方法以及作为参数的 'TrMap' 类对象,以将“此”对象与新创建的对象进行比较。

  • 现在,在 main() 方法中,声明一个名为 'obj' 的 TreeMap 的 'TrMap' 类对象,并使用名为 'put()' 的内置方法将对象的详细信息存储到其中。'item' 是键,其对应值为 'price'。

  • 最后,在 for-each 循环内使用 'keySet()' 方法检索和打印与键关联的值。

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

如何使用 Comparator 修复 java.lang.ClassCastException

首先,让我们介绍 Comparator 接口。

Comparator

顾名思义,它用于比较某些东西。在 Java 中,Comparator 是一个接口,用于对自定义对象进行排序。我们可以在其名为 'compare()' 的内置方法中编写我们自己的逻辑来对指定的物体进行排序。此方法将两个对象作为参数,然后返回一个整数值。通过此整数值,Comparator 决定哪个对象更大。

语法

class nameOfComparator implements Comparator< TypeOfComparator >() {
	compare( type object1, type object2 ) {
		// logic for comparison
	}
}    

示例 3

以下示例说明了在修复 ClassCastException 中使用 Comparator 的方法。

方法

  • 首先,导入 'java.util' 包,以便我们可以使用 TreeSet。

  • 创建一个类 'TrMap'。在其中,声明两个变量并定义此类的构造函数以及两个参数 'item' 和 'price',类型分别为字符串和整数。

  • 接下来,我们将使用 'toString()' 方法将对象的数据转换为字符串。

  • 然后,定义另一个类 'Comp',它实现了 Comparator 接口,并在其中使用 'compare()' 方法以升序对 TreeMap 进行排序。

  • 在 'main()' 方法内部,通过传递 'Comp' 类的实例来创建 TreeMap 集合,以便对其进行排序。

  • 最后,使用 'put()' 方法将一些元素存储到 TreeMap 集合中,然后打印结果。

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。在下一节中,我们讨论了 Comparator 和 Comparable 接口,它们可以帮助修复此 ClassCastException。然后,我们看到了三个示例程序,它们显示了 ClassCastException 以及如何修复此异常。

更新时间: 2023 年 7 月 20 日

329 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.