我有一个清单:
case class Dog(age: Int)
val dogs: List[Dog] = Dog(5) :: Dog(2) :: Dog(2) :: Dog(4) :: Dog(4) :: Dog(4) :: Dog(8) :: Nil
我会列出它会创建等于狗年龄的孩子数量。你可以帮帮我吗?感谢!!!
我想要的结果是:列表[狗] =列表[狗(5),狗(5),狗(5),狗(5),狗(5),狗(2),狗(2) ,狗(2),狗(2)),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4) ),狗(4),狗(4),狗(4),狗(4),狗(8),狗(8),狗(8),狗(8),狗(8),狗(8) ),犬(8),犬(8)]
答案 0 :(得分:0)
scala> case class Dog(age: Int)
defined class Dog
scala> val dogs: List[Dog] = Dog(5) :: Dog(2) :: Dog(2) :: Dog(4) :: Dog(4) :: Dog(4) :: Dog(8) :: Nil
dogs: List[Dog] = List(Dog(5), Dog(2), Dog(2), Dog(4), Dog(4), Dog(4), Dog(8))
scala> dogs.groupBy(_.age).mapValues(_.size)
res0: scala.collection.immutable.Map[Int,Int] = Map(8 -> 1, 2 -> 2, 5 -> 1, 4 -> 3)
答案 1 :(得分:0)
你的问题有点不清楚,所以你可能想要清理它,但我想我明白你的意思 - 假设你的狗的定义类似
case class Dog(age: Int)
然后你可以像这样创建一个地图
val doggies = dogs map(i => i.age -> i) toMap
doggies: scala.collection.immutable.Map[Int,Dog] = Map(5 -> Dog(5), 2 -> Dog(2), 4 -> Dog(4), 8 -> Dog(8))
顺便说一下,如果你愿意,你可以像这样创建你的列表:
val dogs: List[Dog] = List(Dog(5), Dog(2), Dog(2), Dog(4), Dog(4), Dog(4), Dog(8))
修改强>
我见过你已经改变了你的问题,你想要这个
scala> dogs.flatMap(i => List.fill(i.age)(i))
res13:列表[狗] =列表(狗(5),狗(5),狗(5),狗(5),狗(5),狗(2),狗(2),狗(2) ),狗(2),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4),狗(4) ),狗(4),狗(4),狗(4),狗(8),狗(8),狗(8),狗(8),狗(8),狗(8),狗(8) ),狗(8))
其中List.fill(n)(e)将创建一个e f的列表
答案 2 :(得分:0)
我觉得非常简单:
list.flatMap(dog => {for(i< - (0 to dog.age))yield dog.clone})