假设我有一个类如下:
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 中表达它?
获取人员列表,并对其使用过滤方法,检查每个受抚养人是否包含一个年龄为 11 岁的人。
pList.filter(_.dependents.exists(_.age == 11))
这显然只会检查 1 层深度,因此在您的示例中,它将返回 Tom
和 Jimmy
,因为它们是唯一具有 11 岁直接依赖者的Persons
:
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))
你对算法的描述很好地转化为 a 用于在 scala 中理解。
对于 pList 中每个人(p)的每个受抚养人(d),如果年龄 受抚养人(d)是== 11,收集人(p)
我们遍历pList
,并在每次迭代时创建一个新的变量person
。如果该人的家属符合警卫标准,我们将该人从pList
yield
。即 if person.dependents.exists(dependent => dependent.age == 11)
for
和yield
:
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())))
)