具体错误:

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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tjk12345/article/details/109626379