You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java基于x、y双值自定义数组排序时抛出异常的问题咨询

解决数组自定义排序的异常问题

嘿,我一眼就看出问题所在啦!你的代码运行时抛出异常,核心原因是调用Arrays.sort(c)的方式不对,咱们来拆解下:

问题根源

Java的Arrays.sort(T[])方法,默认要求数组里的元素类实现Comparable<T>接口,这样JVM才知道怎么比较两个对象。但你的coder类既没实现Comparable,调用排序时也没传入你写好的CoderRating比较器实例,所以JVM无法完成比较,直接抛出ClassCastException。

两种解决方案

方案一:传入自定义Comparator实例

既然你已经写好了实现Comparator的CoderRating类,只需要在调用Arrays.sort时把这个比较器传进去就行,用Arrays.sort(T[] a, Comparator<? super T> c)这个重载方法:

修改后的完整代码:

class coder { int x,y,index; }
public class CoderRating implements Comparator<coder>{
    public int compare(coder A,coder B) {
        if(A.x==B.x) {
            if(A.y<B.y) return -1;
            else if(A.y>B.y) return 1;
            else return 0;
        } else if(A.x<B.x) return -1;
        else return 1;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        coder []c=new coder[n];
        for(int i=0;i<n;i++) {
            c[i]=new coder();
            c[i].x=sc.nextInt();
            c[i].y=sc.nextInt();
            c[i].index=i;
        }
        // 关键修改:传入CoderRating的实例作为比较器
        Arrays.sort(c, new CoderRating());
        for(int i=0;i<n;i++) {
            System.out.println(c[i].x + " "+c[i].y );
        }
    }
}

方案二:让coder类实现Comparable接口

如果你不想单独写一个Comparator类,也可以直接让coder类实现Comparable<coder>接口,重写compareTo方法把排序逻辑写进去:

修改后的代码:

class coder implements Comparable<coder> { 
    int x,y,index;
    
    @Override
    public int compareTo(coder other) {
        if(this.x == other.x) {
            // x相同时按y升序
            return Integer.compare(this.y, other.y);
        }
        // 优先按x升序
        return Integer.compare(this.x, other.x);
    }
}
public class CoderRating {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        coder []c=new coder[n];
        for(int i=0;i<n;i++) {
            c[i]=new coder();
            c[i].x=sc.nextInt();
            c[i].y=sc.nextInt();
            c[i].index=i;
        }
        // 现在可以直接用默认的sort方法,因为coder实现了Comparable
        Arrays.sort(c);
        for(int i=0;i<n;i++) {
            System.out.println(c[i].x + " "+c[i].y );
        }
    }
}

另外补充个小技巧:用Integer.compare(a, b)可以替代你手写的if-else判断,代码更简洁,逻辑完全一致哦~

内容的提问来源于stack exchange,提问作者Aashish Kalia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:40:36