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

一种解决方案是:

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']

可以使用 将同一件事转换为一个表达式inject,尽管我认为它变得不那么可读:

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