我想根据特定主题过滤学生列表中的主题列表,例如"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"))
答案 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
}