機械翻訳について

コレクション内のアイテムの最大数の計算

コレクション内の最大アイテムを確認するには、引数を指定しないでmax()関数をコールします。

ただし、特定の条件に基づいてコレクション内のアイテムのサブセットから最大値を検索する必要がある場合は、最大値を検索する式を識別するクローズをmax()に渡します。 たとえば、システムに対するアクセス数に基づいて、次のユーザー・リストの最大アイテムを検索するには、次の手順を実行します:

def users = [
             'smuench':[name:'Steve', badge:'A123', accesses: 1001],
             'sburns':[name:'Steve', badge:'C789', accesses: 52],
             'qbronson':[name:'Quello', badge:'Z231', accesses: 152],
             'jevans':[name:'Joe', badge:'B456', accesses: 1001]
            ]
// Return the map entry with the maximum value based on accesses
def maxUser = users.max { it.value.accesses }
max()関数は、最大accesses値が1001の「最初の」アイテムを返します。これは、smuenchに対応するマップ・エントリです。 ただし、最大値を持つすべてのユーザーを返すには、最初にアクセスの最大値を決定し、次にその値がaccessesプロパティのすべてのマップ・エントリを検索する必要があります。 このコードは次のようになります:
// Find the maximum value of the accesses property
def maxAccesses = users.max { it.value.accesses }.value.accesses
// Return all map entries having that value for accesses
def usersWithMaxAccesses = users.findAll{ it.value.accesses == maxAccesses }

問題を解く方法はしばしば複数あります。 アクセスの最大数をコンピュートする別の方法は、最初にすべてのaccesses値をcollect()してから、その番号のコレクションでmax()をコールすることです。 その代替方法は次のようになります:

// Find the maximum value of the accesses property
def maxAccesses = users.collect{ it.value.accesses }.max()
どちらかのアプローチを使用して最大アクセス値を見つけると、生成されるマップは次のようになります:
[
  smuench:[name:Steve, badge:A123, accesses:1001],
  jevans:[name:Joe, badge:B456, accesses:1001]
]

検索する最大要素を持つコレクションでカスタム比較が正しく行われる必要がある場合、sort()関数でサポートされる同じ種類の2パラメータ・コンパレータ・クローズを渡すことができます。