根据scala中的参数过滤列表
Filter a List based on a parameter in scala
我想根据特定科目过滤学生列表中的科目列表,即 "maths"
在我的例子中。
下面是定义 Student 和 Subject 的代码 class。
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"))
您所做的没有用,因为您将学生列表变成了学科列表。
我下面做的是保留每个学生,但修改他们的科目列表
sList.map(student => student.copy(subjects = student.subjects.filter(_.name=="maths")))
如果列表中有未注册相关主题的学生,那么我认为您不希望该学生出现在结果列表中。
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
}
我想根据特定科目过滤学生列表中的科目列表,即 "maths"
在我的例子中。
下面是定义 Student 和 Subject 的代码 class。
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"))
您所做的没有用,因为您将学生列表变成了学科列表。
我下面做的是保留每个学生,但修改他们的科目列表
sList.map(student => student.copy(subjects = student.subjects.filter(_.name=="maths")))
如果列表中有未注册相关主题的学生,那么我认为您不希望该学生出现在结果列表中。
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
}