根据scala中的参数筛选List

时间:2017-08-31 04:57:20

标签: scala case-class

我想根据特定主题过滤学生列表中的主题列表,例如"maths"

以下是定义学生和主题类的代码。

 case class Student(
    name:String,
    age:Int,
    subjects:List[Subject]
  )

  case class Subject(name:String)

  val sub1=Subject("maths")
  val sub2=Subject("science")
  val sub3=Subject("english")
  val s1=Student("abc",20,List(sub1,sub2))
  val s2=Student("def",20,List(sub3,sub1))

  val sList=List(s1,s2)

预期输出

带有过滤主题的学生(s1,s2)列表,如下所述

s1 contains Student("abc",20,List(sub1))s2 contains Student("def",20,List(sub1)),即sub2 and sub3已被过滤掉。

我在下面试过,但它没有起作用

 val filtered=sList.map(x=>x.subjects.filter(_.name=="maths"))

2 个答案:

答案 0 :(得分:3)

您所做的不起作用,因为您将学生列表转换为(主题列表)列表。

我在下面做的是保留每个学生,但修改他们的主题列表

sList.map(student => student.copy(subjects = student.subjects.filter(_.name=="maths")))

答案 1 :(得分:1)

如果列表中的学生没有注册相关主题,那么我认为您不希望该学生进入结果列表。

val s3=Student("xyz",20,List(sub2,sub3))

val sList=List(s1,s2,s3)
sList.flatMap{s =>
  if (s.subjects.contains(sub1))         // if sub1 is in the subjects list
    Some(s.copy(subjects = List(sub1)))  // drop all others from the list
  else 
    None  // no sub1 in subjects list, skip this student
}