我有一個非常簡單的輔助類,看起來像:
private static class IntIdx {
int val;
int idx;
IntIdx(int val, int idx) {
this.val = val;
this.idx = idx;
}
public int getValue() {
return val;
}
public int getIdx() {
return idx;
}
}
我使用了一個比較器,它按值排序,然后按索引:
static public List<Integer> decode(List<Integer> al) {
final Comparator<IntIdx> idxComp = Comparator
.comparingInt(IntIdx::getValue)
.thenComparingInt(IntIdx::getIdx);
...[other code]...
}
我現在有一種情況,值必須以不同的順序排序,所以我想允許呼叫者傳入一個 Comparator<Integer> 作為值部分。問題是我不知道如何使用與上面類似的語法來創建這樣的比較器。因為呼叫者不需要知道實作細節,所以他們沒有傳遞 Comparator<IntIdx>,他們傳遞的是 Comparator<Integer>,我不知道如何使用比較器將 IntIdx 的比較器鏈接在一起整數。
我可以寫如下內容:
static public List<Integer> decode(List<Integer> al, Comparator<Integer> valComp) {
final Comparator<IntIdx> testComp = (i1, i2) -> {
int r = valComp.compare(i1.getValue(), i2.getValue());
if (r != 0) {
return r;
}
return Integer.compare(i1.getIdx(), i2.getIdx());
};
...[other code]...
}
這應該可行,但感覺比我目前擁有的要混亂得多。這是寫這個的最好方法嗎?有什么辦法可以寫出上面是Comparator.comparing...當前實作中的好語法嗎?
感覺應該有以下內容(我理解這不起作用)
final Comparator<IntIdx> testComp = Comparator.compare(valComp.compare(IntIdx::getValue)).thenComparingInt(IntIdx::getIdx)
或者
final Comparator<IntIdx> testComp = valComp.comparing(IntIdx::getValue).thenComparingInt(IntIdx::getIdx);
盡管我在 Comparator 檔案或我的 Google/SO 搜索中找不到類似的東西。
我認為這是一個相對常見的事情,我只是不知道要搜索的正確術語。當答案揭曉時,我期待著打臉。
如果呼叫者傳入一個 Comparator<IntIdx>,就很容易將它鏈接在一起,就像
final Comparator<IntIdx> iiComp = valComp.thenComparingInt(IntIdx::getIdx);
但這不是我的情況。
uj5u.com熱心網友回復:
通過撰寫一個復雜的多行 lambda 來實作Comparator是容易出錯的。利用 Java 8 工廠方法始終是定義 a 的首選方法Comparator,您只需要使用另一個靜態方法。
替換comparingInt()為comparing(Function, Comparator),它允許提供一個比較器,用于比較指定函式產生的結果:
static public List<Integer> decode(List<Integer> al,
Comparator<Integer> valComp) {
final Comparator<IntIdx> idxComp = Comparator
.comparing(IntIdx::getValue, valComp)
.thenComparingInt(IntIdx::getIdx);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/524710.html
標籤:爪哇排序比较器
上一篇:在此串列中,名字出現在姓氏之前。我想按姓氏的字母順序對串列進行排序。怎么做?
下一篇:定義字謎Python
