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
相关产品推荐
相关产品推荐

