Groovy 的串列有一個 sort() 方法,您可以向該方法提供對集合進行排序的標準。例如:
def foo = ["abc", "de", "fghi"]
println foo.sort { it.size() }
顯示“[de, abc, fghi]”。我認為引擎蓋下的這種機制使用 spaceship 運算子呼叫 Java 的方法,因為以下代碼片段顯示了相同的結果:
def foo = ["abc", "de", "fghi"]
def bar = ["abc", "de", "fghi"]
println foo.sort { it }
println bar.sort { a, b -> a <=> b }
然而,事實并非如此,因為:
def someDate = new Wrapper(new Date())
def someString = new Wrapper("16")
def someNumber = new Wrapper(4)
def foo = [someDate, someString, someNumber]
def bar = [someDate, someString, someNumber]
println foo.sort { it.value } // Produces "valid" output: [4, 16, Wed Jun 01..]
println foo.sort { a, b -> a.value <=> b.value} // Throws ClassCastException
//Simmulates JSON object I am working with
class Wrapper {
Object value
Object value2
Wrapper(value) {
this.value = value
}
@Override
String toString() {
return value
}
}
那么,它是如何真正起作用的呢?有什么方法可以讓我在 sort 引數中使用這樣的 Groovish 比較器并對其進行一些調整(例如,以便我可以按二階欄位 value2 的值進行排序)?
uj5u.com熱心網友回復:
當您使用sort{x->...}一個引數時,將使用OrderBy比較器。
至于我,當您在同一個串列中有不同型別時,結果是不可預測的。
只需嘗試運行并預測以下腳本的輸出:
println( ['xx', new Date(), 1199999999].sort{it} )
println( ['xx', new Date(), 11999999999].sort{it} )
但是,如果您想使用它:
println foo.toSorted ( new OrderBy([{it.value},{it.value2}]) )
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485222.html
上一篇:以插值順序將專案推送到陣列
