我正在使用AlphanumComparatorUsing the AlphanumComparator。我無法弄清楚如何將其他比較器鏈接到它。
我有一個名為NodeInstance. 我想對 2 個欄位進行排序。 definitionId是一個列舉,它toString是一個字母數字欄位。 displayOrder是一個整數。
嘗試過這樣的事情
Comparator<NodeInstance> comparator = ((s1, s2) -> new AlphanumComparator()
.compare(((NodeInstance) s1).getDefinitionId().toString(), ((NodeInstance) s2).getDefinitionId().toString()))
.thenComparingInt(NodeInstance::getDisplayOrder);
但 IntelliJ 警告我Inconvertible types; cannot cast '<lambda parameter>' to NodeInstane。
我無法找出正確的語法來讓它作業。
我正在嘗試在 a 中使用它TreeSet,所以最終我希望能夠執行 `new TreeSet<>(comarator);
uj5u.com熱心網友回復:
AlphanumComparator是介面的常規實作,因此您需要利用比較器的流暢方法,Comparator而不是在 lambda 內部搞亂。compare()static
我認為您正在尋找Comparator.comparing(keyExtractor, keyComparator),它需要一個從引數中提取排序鍵的函式,以及一個應該用于比較排序鍵的 Comparator 。
其中鍵提取器函式將是以下 lambda 運算式:
(NodeInstance node) -> node.getDefinitionId().toString()
一個實體AlphanumComparator將作為一個關鍵的比較器。
Comparator<NodeInstance> comparator =
Comparator.comparing(
(NodeInstance node) -> node.getDefinitionId().toString(),
new AlphanumComparator()
)
.thenComparingInt(NodeInstance::getDisplayOrder);
lambda 運算式中的顯式型別需要正確,因為它無法根據聚合比較器的目標型別正確推斷。
或者,您可以使用所謂的型別見證,而不是在 lambda 中指定型別 Comparator.<NodeInstance,String>comparing(node -> ...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/529485.html
標籤:爪哇排序比较器
上一篇:因此按3、31和月份排序
