2

getName() および getYearOfBirth() メソッドを持つ Person オブジェクトを持つ人のリストがあります。groupBy を使用して Person オブジェクトをグループ化しています。私は groupBy を使用して Person オブジェクトをグループ化していますが、Person には将来多くの追加フィールドがあるため、名前のみをマップに入れたいと考えています。年数がカギになります。

    class Person {
        String name
        int yearOfBirth
    }       

    def people = [ 
        new Person(name:"Tom", yearOfBirth:1985),
        new Person(name:"Abigail", yearOfBirth:1987),
        new Person(name:"Joyce", yearOfBirth:1984),
        new Person(name:"James", yearOfBirth:1987),
        new Person(name:"Scott", yearOfBirth:1985),
        new Person(name:"Ruth", yearOfBirth:1984)
    ]           

    //people.groupBy(_.year) mapValues (_ map (_.name))  how to map here?

これはScala アプリの直接ポートです

4

2 に答える 2

2

1つの解決策は次のとおりです。

def nameInYear = people.groupBy { it.yearOfBirth }
                       .collectEntries { [ (it.key):it.value.name ] }
assert nameInYear[ 1984 ] == [ 'Joyce', 'Ruth' ]

したがって、それらを生年ごとにグループ化して、YEAR-> ListOfPeopleマップを取得します。次に、これらのグループ化ごとに、YEAR->ListOfNamesのマップを収集します。

于 2012-06-24T12:02:06.007 に答える
0

別の、より重要な解決策は次のとおりです。

def namesByYear = [:].withDefault { [] } 
people.each { namesByYear[it.yearOfBirth] << it.name }

assert namesByYear[1985] == ['Tom', 'Scott']

を使用して同じことを 1 つの式に変換できますinjectが、読みにくくなると思います。

def namesByYear = people.inject([:].withDefault { [] }) { map, p ->
    map[p.yearOfBirth] << p.name
    map
}
于 2012-06-24T22:04:18.990 に答える