使用附加條件按字典順序對字符陣列進行排序,即所有 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));
}
給出輸出:[a, a, a, a, a, b, c, b, d, r, r]。c 只出現在 b 之一之前。如果我將比較器更改為以下內容,則它會提供正確的輸出。
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。解釋內部發生的事情。謝謝!
uj5u.com熱心網友回復:
問題是,如果通過'c',并'b'使得比較回傳負值,則傳遞'b'和'c'應該回傳一個積極的(和你的第一個版本的回報在這種情況下為負數,而不是)。如果無論引數的順序如何,函式都沒有回傳一致的結果,則排序演算法將產生垃圾順序。
考慮這個版本:
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);
}
}
uj5u.com熱心網友回復:
您可以添加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]
uj5u.com熱心網友回復:
請參閱Javadoc 以獲取java.util.Comparator. 它說的方法compare():
比較它的兩個引數的順序。當第一個引數小于、等于或大于第二個引數時,回傳一個負整數、零或正整數。
對于您的情況,這意味著compare( 'b', 'c' )應該回傳大于零的compare( 'c', 'b' )東西,對于小于零的東西,而自然順序則相反。
但是你的第一個實作(那個錯誤的)只覆寫了 case compare( 'c', 'b' ),而不是compare( 'b', 'c' ),這樣該方法就會回傳默認值。
您的第二個正確作業的實作解決了這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384816.html
