コレクション内のアイテムのソート
コレクション内のアイテムをソートするには、sort()関数を使用します。 コレクションが単純なリストの場合、アイテムは自然な順序で昇順にソートされます。
たとえば、この行は名前のリストをアルファベット順にソートします。 呼び出すコレクションが更新され、ソートされた順序が反映されます:
def names = ['Zane','Jasmine','Abigail','Adam']
names.sort()
マップのリストについて、特定のマップ・プロパティの値でソートする場合は、ソートに使用するプロパティを返すクローズを渡します。 次の例は、ユーザーが作成した
accesses
の数に基づいてusers
コレクションをソートする方法を示しています。 def users = [
[userid:'smuench', name:'Steve', badge:'A123', accesses: 135],
[userid:'jevans', name:'Joe', badge:'B456', accesses: 1001],
[userid:'sburns', name:'Steve', badge:'C789', accesses: 52]
]
// Sort the list of maps based on the accesses property of each map
users.sort { it.accesses }
マップのマップの場合、アプローチは似ていますが、クローズにはマップ・エントリ・キー/バリュー・ペアが渡されるため、このユースケースでは、次に示すように
accesses
プロパティを参照する前にマップ・エントリのvalue
プロパティにアクセスする必要があります。
def users = [
'smuench':[name:'Steve', badge:'A123', accesses: 135],
'jevans':[name:'Joe', badge:'B456', accesses: 1001],
'sburns':[name:'Steve', badge:'C789', accesses: 52]
]
// Sort the map of maps based on the accesses property of map entry's value
users.sort { it.value.accesses }
ソートをより詳細に制御する必要がある場合は、次の2つのパラメータを受け入れて戻すクローズを渡すことができます:
-
0
- 等しい場合 -
-1
- 最初のパラメータが2番目のパラメータより小さい場合 -
1
- 最初のパラメータが2番目のパラメータより大きい場合
コンパレータ・クローズを実装する最も簡単な方法は、Groovy比較演算子(
<=>
)を使用することです。 次の例では、2パラメータ・クローズでこの演算子を使用して、最初のマップ・エントリの値のaccesses
プロパティの値と、2番目のマップ・エントリの値の同じプロパティの対応する値を比較して、適切な整数を返します。 // Sort map of maps by comparing the accesses property of map entry's value
users.sort { a, b -> a.value.accesses <=> b.value.accesses }
必要に応じてソート順序を「降順」に戻すには、クローズに渡される2つのパラメータのロールをスワップします。 たとえば、次に示すように、ユーザー・リストをアクセス数で降順にソートするには、矢印の右側にあるa
およびb
パラメータを入れ替えます:
// Sort map of maps DESCENDING by comparing the accesses property of map entry's value
users.sort { a, b -> b.value.accesses <=> a.value.accesses }
ソートのニーズがより複雑である場合、3つの予期される整数の値のいずれかを返すかぎり、必要な方法でコンパレータ・クローズを実装できます。