具体错误:
Exception in thread “main” java.lang.ClassCastException: a.b.c.A cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at a.b.c.ces.main(ces.java:58)
错误原因:往需要排序的集合中添加自定义类的数据
class A {
private int asd;
private String s;
public A(int asd, String s){
this.asd = asd;
this.s = s;
}
}
TreeSet<A> set = new TreeSet<A>();
set.add(new A(12,"Asd"));
set.add(new A(52,"d"));
set.add(new A(2,"Ajhd"));
set.add(new A(7,"Aghjd"));
set.add(new A(72,"Adgd"));
System.out.println(set);
因为自定义类中没有定义排序规则,无法排序,报错。
解决方法1:
自定义类实现Comparable接口并重写compareTo(T o)方法。
class A implements Comparable{
private int asd;
private String s;
public A(int asd, String s){
this.asd = asd;
this.s = s;
}
@Override
public int compareTo(Object o) {
//自定义排序规则,详见Comparable接口说明
return 0;
}
}
解决方法2:
在新建集合对象时传入参数:
TreeSet<A> set = new TreeSet<A>(new Comparator<A>() {
@Override
public int compare(A o1, A o2) {
//自定义排序规则
return o1.getAsd() - o2.getAsd();
}
});
解决方法3:
是解决方法2的优化,使用Lambda表达式
TreeSet<A> set = new TreeSet<A>((a,b)->a.getAsd() - b.getAsd());
//详见Lambda表达式
版权声明:本文为tjk12345原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。