コレクションを最初のパラメーターでソートする「グルーヴィーな」方法はありますか?最初のパラメーターが2つ以上の要素で繰り返される場合、2番目のパラメーター(2番目のパラメーターは配列)でソートしますか?
例:
編集済み(サブ配列の長さは可変):
[1, [1,2,3]]
[1, [4,6]]
[2, [1,2,3,4,5]]
[3, [1,2,3]]
[3, [ 1,2,4,5]]
前もって感謝します
コレクションを最初のパラメーターでソートする「グルーヴィーな」方法はありますか?最初のパラメーターが2つ以上の要素で繰り返される場合、2番目のパラメーター(2番目のパラメーターは配列)でソートしますか?
例:
編集済み(サブ配列の長さは可変):
[1, [1,2,3]]
[1, [4,6]]
[2, [1,2,3,4,5]]
[3, [1,2,3]]
[3, [ 1,2,4,5]]
前もって感謝します
次のtim yatesの要点を見てください。
複数のコンパレータを使用してリストをソートする方法を示します。
あなたの例:
Collection.metaClass.sort = { boolean mutate, Closure... closures ->
delegate.sort( mutate ) { a, b ->
closures.findResult { c -> c( a ) <=> c( b ) ?: null }
}
}
def list = [[3, [1,2,3]],
[1, [4,5,6]],
[2, [1,2,3]],
[1, [1,2,3]],
[3, [1,2,4]]]
assert list.sort(false, {it[0]}, {it[1][0]}, {it[1][1]}, {it[1][2]}) == [[1, [1,2,3]],
[1, [4,5,6]],
[2, [1,2,3]],
[3, [1,2,3]],
[3, [1,2,4]]]
それが役立つことを願っています...
カスタムソートを構築したい場合は、.sort を使用できます。
def lis = []
lis << [3, [1,2,4]]
lis << [1, [1,2,3]]
lis << [3, [1,2,3]]
lis << [1, [4,5,6]]
lis << [2, [1,2,3]]
lis.sort{a,b->
if(a[0]==b[0])
{
def aArray = a[1]
def bArray = b[1]
for(int i=0;i<aArray.size();i++)
{
if(bArray[i])
{
if(aArray[i]!=bArray[i])
{
return aArray[i]<=>bArray[i]
}
}
else
{
return 1
}
}
return 0
}
else
return a[0]<=>b[0]
}
lis.each{x->
println x
}
リストの長さが異なり、アプリのニーズに合わせて改善できる場合は、あまりうまく処理できませんでした。