2017-08-31 11 views
1

私の場合、特定の科目に基づいて学生のリスト内の科目のリスト、すなわち"maths"をフィルタリングしたいと思います。スカラーのパラメータに基づいてリストをフィルタリングする

以下は、StudentクラスとSubjectクラスを定義するコードです。除外され

s1 contains Student("abc",20,List(sub1))s2 contains Student("def",20,List(sub1))すなわちsub2 and sub3以下に説明するように

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)

リストです。

私は以下しようとしたが、それはあなたが被験者(のリスト)のリストに学生のリストを回すので、あなたが動作しませんでした何

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

は、私は誰かがすでにあなたの質問に答えていますが、それはうまくいきませんでしたどのように言わずに「それは動作しませんでした」(理想的には、それが代わりにやったの言う入れないでください知っている「それが働いたdidnot」それがあなたが期待したものとどう違うか) –

答えて

3

を働いたdidnot。問題の対象にサインアップしていなかったリストの学生がある場合、私はあなたが「wouldnと仮定私は下記行う

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 
} 
関連する問題