2017-08-31 35 views
1

我想过滤基于特定主题的学生列表内的主题列表,即在我的情况下为"maths"根据scala中的参数过滤列表

以下是定义Student和Subject类的代码。

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 contains Student("abc",20,List(sub1))s2 contains Student("def",20,List(sub1))sub2 and sub3作为解释被过滤掉与过滤科目的学生(s1,s2)

名单。

下面我试过,但它因此未工作

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

“它因此未工作”我知道其他人已经回答了你的问题,但请不要把“它不工作”没有什么办法没有奏效说(理想情况下,说什么它没有做,而不是以及它与预期的不同之处) –

回答

3

什么你,因为你把学生名单到的科目(列表)名单也不起作用。

我下面要做的就是保持每个学生,但修改其科目列表

sList.map(student => student.copy(subjects = student.subjects.filter(_.name=="maths"))) 
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 
}