[英]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.