3

假设我有一个课程如下:

case class Person(
name:String,
age:Int,
dependents:List[Person]
)

假设我有以下四个人:

val p1 = Person("Tom",50,List(p2,p4))
val p2 = Person("Bob",20,List(p3))
val p3 = Person("Jimmy",25,List(p4))
val p4 = Person("Harry",11,Nil)

我的人员列表是 val pList = List(p1,p2,p3,p4)

我想过滤此集合以获取所有有 11 岁受抚养人的人。

一种方法是什么?

该算法可以总结为对于pList中每个人(p)的每个被抚养人(d),如果被抚养人(d)的年龄== 11,则收集人(p)。

我如何在scala中表达它?

4

2 回答 2

9

获取人员列表,并对其使用过滤器方法,检查每个受抚养人是否包含年龄为 11 岁的人员。

pList.filter(_.dependents.exists(_.age == 11))

这显然只会检查 1 层深度,因此在您的示例中,它将返回Tomand Jimmy,因为它们是唯一Persons一个 11 岁的直接受抚养人:

Person(
  Tom,
  50,
  List(Person(Bob,20,List(Person(Jimmy,25,List(Person(Harry,11,List()))))), Person(Harry,11,List()))
  )
Person(
  Jimmy,
  25,
  List(Person(Harry,11,List()))
  )

或者,您可以使其更通用,如下所示:

def dependentAged(age: Int)(person: Person) = person.dependents.exists(_.age == age)
val filtered = pList.filter(dependentAged(11))
于 2012-11-28T05:43:08.327 回答
4

您对算法的描述很好地转化为 scala 中的理解

对于 pList 中每个人(p)的每个受抚养人(d),如果受抚养人(d)的年龄 == 11,则收集人(p)

我们迭代并在每次迭代时pList创建一个新变量。person如果此人的家属符合守卫标准,则我们yield来自pList. IEif person.dependents.exists(dependent => dependent.age == 11)

foryield:_

for(person <- pList if person.dependents.exists(dependent => dependent.age == 11)) yield person

这给出了两个人的列表:

List[Person] = List(
  Person(Tom,50,List(Person(Bob,20,List(Person(Jimmy,25,List(Person(Harry,11,List()))))),     
  Person(Harry,11,List()))), Person(Jimmy,25,List(Person(Harry,11,List())))
)
于 2012-11-28T05:54:07.250 回答