簡體   English   中英

Java 自定義比較器實現

[英]Java custom Comparator implementation

我正在編寫一個比較器,我可以使用它使用字符數對字符串數組進行排序。 字符串都是小寫的 ASCII 字符。

例如。

input = {"art", "bash", "tar"};
Expected sorted output = {"art", "tar", "bash"}; 

在這里,“bash”是否在開頭並不重要,但“art”和“tar”應該一個接一個,沒有特定的順序,因為它們具有匹配的字符數。

我有這段代碼,我在其中使用一個簡單的數組來檢查和保持字符數並進行比較。

Comparator<String> comparator = new Comparator<String>() {
    
    @Override
    public int compare(String s1, String s2){
        if (s1.equals(s2)) return 0;
        
        int[] a1 = getCountArray(s1);
        int[] a2 = getCountArray(s2);
        if (Arrays.equals(a1, a2)) return 0; // character count matches

        return s1.compareTo(s2);
    }

    private int[] getCountArray(String s) {
        int[] array = new int[256];
        for (int i=0; i<s.length(); i++){
            array[s.charAt(i) - 'a'] ++;
        }
        return array;
    }

};
String[] input = {"art", "bash", "tar"};
Arrays.sort(input, comparator); 

但是,它不起作用。 我究竟做錯了什么?

您的比較器不一致:

  • 當比較“art”和“bash”時,它返回“art”小於“bash”
  • 當比較“bash”和“tar”時,它返回“bash”小於“tar”
  • 因此,當比較“art”和“tar”時,它必須返回“art”小於“tar”(因為“art”<“bash”<“tar”),但比較器返回的“art”與“tar”相同”。

當您調用Arrays.sort(input, comparator); sort 方法將進行成對比較,並且總是會發現“bash”必須在“tar”之前。

要解決此問題,您必須將return s1.compareTo(s2)替換為比較字符數 arrays a1a2的內容。

暫無
暫無

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

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