機械翻訳について

コレクション内のアイテムのソート

コレクション内のアイテムをソートするには、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つの予期される整数の値のいずれかを返すかぎり、必要な方法でコンパレータ・クローズを実装できます。