根据嵌套类型过滤对象列表

sc_*_*ray 3 iteration algorithm collections scala

可以说我有一个课程如下:

case class Person(
name:String,
age:Int,
dependents:List[Person]
)
Run Code Online (Sandbox Code Playgroud)

可以说我有以下四个人:

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)
Run Code Online (Sandbox Code Playgroud)

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

我想过滤这个系列,以便让所有11岁的人都有依赖.

什么是一种方法呢?

该算法可以总结为对于pList中每个人(p)的每个依赖(d),如果依赖的年龄(d)是== 11,则收集人(p).

我如何用scala表达它?

Dom*_*mra 9

记下人员名单,并在其上使用过滤方法,检查每个受抚养人是否包含年龄为11岁的人.

pList.filter(_.dependents.exists(_.age == 11))
Run Code Online (Sandbox Code Playgroud)

这将只检查1层显然深,所以在你的榜样,它会返回TomJimmy,因为他们是唯一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()))
  )
Run Code Online (Sandbox Code Playgroud)

或者你可以使它更通用,如下所示:

def dependentAged(age: Int)(person: Person) = person.dependents.exists(_.age == age)
val filtered = pList.filter(dependentAged(11))
Run Code Online (Sandbox Code Playgroud)

  • @ziggystar - 用不可变的case类创建循环很困难. (2认同)