我想念什么吗?它给出了排序方法上的错误(无法识别比较器方法),但是如果我使用Integer类型的数组,那么该错误就会消失。我们不能用原始类型的数组进行这种比较吗?
public class Test {
public static void main(String[] args) {
int a[]={21,58,89,45,73,24};
Arrays.sort(a,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
if(o1%10>o2%10) return -1;
return 1;
}
});
答案 0 :(得分:2)
不,你不能。原始数组只能使用接受原始数组的方法进行排序,例如static void sort(int[] a)
。
您不能将原始数组传递给public static <T> void sort(T[] a, Comparator<? super T> c)
,因为一般类型参数只能用引用类型代替,而不能用原始类型代替。
此外,您的Comparator
毫无意义,并违反了Comparator
界面的一般协定。因此,您没有理由使用该Comparator
(甚至没有使用Integer
数组)。
根据您的评论,您需要这样的内容:
Integer a[]={21,58,89,45,73,24};
Arrays.sort(a,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
int l1 = o1 % 10;
int l2 = o2 % 10;
if (l1 != l2)
return Integer.compare(l1,l2); // sort by last digit
else
return Integer.compare(o1,o2); // sort by natural order
}
});
答案 1 :(得分:1)
您不能将原始类型传递给sort
方法。
你可以试试这个吗?
// Your array
int a[]={21, 58, 89, 45, 73, 24};
int[] ints = Arrays.stream(a).boxed().sorted(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 % 10 > o2 % 10) return -1;
return 1;
}
}).mapToInt(Integer::intValue).toArray();
答案 2 :(得分:0)
方法的签名为:public static <T> void sort(T[] a, Comparator<? super T> c)
,因此第一个参数是通用的,您不能在其中放置原始类型,这就是为什么会出现错误的原因。对于这种排序,您具有预定义的排序方法,该方法可以采用原始数组
答案 3 :(得分:0)
因为Integer正在实现Comparable Interface,所以可以在Integer上使用Comparator进行排序。只能通过本机方式对原语进行排序-例如,按数字顺序对int进行排序。
您可以执行以下任一操作:
int a[]={21,58,89,45,73,24}; to Integer a[]={21,58,89,45,73,24};
Arrays.sort(a);
public class MyInt implements Comparable<Integer> {
private final int value;
public MyInt(int value) {
this.value = value;
}
@Override
public int compareTo(Integer o) {
return compare(this.value, o);
}
public static int compare(Integer o1, Integer o2) {
if(o1%10>o2%10) return -1;
return 1;
}
}