簡體   English   中英

Arrays.sort() 不接受比較器類型 object

[英]Arrays.sort() is not accepting the comparator type object

我錯過了什么嗎? 它給出了排序方法的錯誤(不識別比較器方法),但如果我使用 Integer 類型的數組,那么這個錯誤就會消失。 我們不能與原始類型的 arrays 進行比較嗎?

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;
            }   
        });

您不能將原始類型傳遞給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();

你不能。 原始數組只能使用接受原始數組的方法進行排序,例如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
    }   
});

方法的簽名是: public static <T> void sort(T[] a, Comparator<? super T> c)所以第一個參數是通用的,你不能把原始類型放在那里,這就是你得到錯誤的原因。 對於這種排序,您有預定義的排序方法,可以采用原始數組

您可以在 Integer 上使用 Comparator 執行排序,因為 Integer 正在實現 Comparable Interface。 原語只能按本機方式排序 - int 例如按數字順序。

您可以執行以下操作之一:

  1. 將 int 轉換為整數int a[]={21,58,89,45,73,24}; to Integer a[]={21,58,89,45,73,24}; int a[]={21,58,89,45,73,24}; to Integer a[]={21,58,89,45,73,24};
  2. 如果使用 int 不要使用 Comparator 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM