簡體   English   中英

使用 java 比較器對字符數組進行排序

[英]Sort character array using java comparator

使用所有 c 都在所有 b 之前的附加條件按字典順序對字符數組進行排序。 這可以手動完成,但我想使用比較器通過內置排序對其進行編碼。 我寫的代碼 -

static class Sort implements Comparator<Character> {
    @Override
    public int compare(Character x, Character y) {
        if(x == 'c' && y == 'b') {
            return y - x;
        }
        return x - y;
    }
}

public static void main(String[] args) {
    String s = "abracadabra";
    int n = s.length();
    Character[] res = new Character[n];
    for (int i = 0; i < n; i++) {
        res[i] = s.charAt(i);
    }
    Arrays.sort(res, new Sort());
    System.out.println(Arrays.toString(res));
}

給出 output:[a,a,a,a,a,b,c,b,d,r,r]。 c 僅出現在 b 之一之前。 如果我將比較器更改為以下,那么它會給出正確的 output。

public int compare(Character x, Character y) {
        if(x == 'c' && y == 'b' || x == 'b' && y == 'c') {
            return y - x;
        }
        return x - y;
    }

我的問題是為什么在這兩種情況下返回“yx”都會給出正確答案? 如果在一種情況下返回“yx”是正確的,那么在另一種情況下不應該返回“xy”是正確的嗎? 而不是“yx”,返回 -1 或 +1 也不起作用。 PL。 解釋內部發生的事情。 謝謝!

問題是,如果傳遞'c''b'使比較返回負值,那么傳遞'b''c'應該返回一個正值(而你的第一個版本在這種情況下返回一個負數)。 如果 function 無論 arguments 的順序如何都沒有返回一致的結果,則排序算法將產生垃圾順序。

考慮這個版本:

    public int compare(Character x, Character y) {
        if (x == 'c' && y == 'b') {
            return -1;
        } else if (x == 'b' && y == 'c') {
            return 1;
        } else {
            return x.compareTo(y);
        }
    }

您可以添加System.out.println()以了解其工作原理:

代碼

import java.util.Arrays;
import java.util.Comparator;

public class Main {

    public static void main(String[] args) {
        String s = "abracadabra";
        int n = s.length();
        
        System.out.println("X Y\tX Y\t[if] VALUE");
        System.out.println();
        
        Character[] res = new Character[n];
        for (int i = 0; i < n; i++) {
            res[i] = s.charAt(i);
        }
        
        int min = 'a';
        
        Arrays.sort(res, new Comparator<Character>() {

            @Override
            public int compare(Character x, Character y) {
                System.out.print(y + " " + x + "\t" + (x-min) + " " + (y-min) + "\t");
                if(x == 'c' && y == 'b') {
                    System.out.println("true " + (y - x));
                    return y - x;
                }
                System.out.println("     " + (x - y));
                return x - y;
            }
        });
        System.out.println("#################################\nResult:\n" + Arrays.toString(res));
    }
}

安慰:

X Y X Y   [if] VALUE

a b 1 0        1
b r 17 1       16
r a 0 17       -17
b a 0 1        -1
a a 0 0        0
b c 2 1   true -1
a c 2 0        2
c a 0 2        -2
a a 0 0        0
c d 3 2        1
r d 3 17       -14
b d 3 1        2
c a 0 2        -2
a a 0 0        0
a a 0 0        0
c b 1 2        -1
a b 1 0        1
a b 1 0        1
b r 17 1       16
d r 17 3       14
r r 17 17      0
c a 0 2        -2
a a 0 0        0
b a 0 1        -1
a a 0 0        0
#################################
Result:
[a, a, a, a, a, b, c, b, d, r, r]

請參閱java.util.Comparator的 Javadoc 它對方法compare()說:

比較其兩個 arguments 的訂單。 返回負 integer、零或正 integer,因為第一個參數小於、等於或大於第二個。

對於您的情況,這意味着compare( 'b', 'c' )應該返回大於零的值,而對於compare( 'c', 'b' ) ) 應該返回小於零的值,而自然順序則相反。

但是您的第一個實現(那個錯誤的實現)僅涵蓋了案例compare( 'c', 'b' ) ,而不是compare( 'b', 'c' ) ,因此該方法將返回默認值。

您的第二個正確工作的實施解決了這個問題。

暫無
暫無

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

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