Arrays.sort()不接受比较器类型的对象

时间:2019-04-11 06:03:51

标签: java comparator

我想念什么吗?它给出了排序方法上的错误(无法识别比较器方法),但是如果我使用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;
            }   
        });

4 个答案:

答案 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进行排序。

您可以执行以下任一操作:

  1. 将int转换为整数int a[]={21,58,89,45,73,24}; to Integer a[]={21,58,89,45,73,24};
  2. 如果使用int则不使用比较器Arrays.sort(a);
  3. 创建您的类,实现Comparable Interface,然后在内部操作int数组-较困难的方法,不建议使用
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;
    }
}