过滤列表清单:基本的东西

时间:2013-09-11 13:29:38

标签: list scala

你知道为什么这个程序没有给出预期答案(List(3,3))吗?

val l=List(List(1,2),List(3,3))
println(l.filter(_ match{
    case u::v => u==v
    case _ => false
}))

谢谢!

4 个答案:

答案 0 :(得分:3)

case u::v => u==v

此处,u的类型为Int,而v的类型为List[Int]。他们不能平等。

答案 1 :(得分:2)

另一种对此进行编码的方法,如果您可能正在处理任意长度的列表并希望仅过滤到所有元素相同的列表,那将非常有用:

l.filter(ls => !ls.isEmpty && ls.forall(_ == ls.head))

!ls.isEmpty片段假定您希望排除空列表)

答案 2 :(得分:2)

如果您要从子列表中提取前两个元素并进行比较,则::中需要两个case

l.filter { 
  case u :: v :: _ => u == v
  case _ => false
}

如果您想确保子列表的所有元素相同,可以使用forall

l.filter {
  case h :: Nil => false // if you want to exclude single elements
  case h :: r => r.forall(_ == h)
  case _ => false
}

答案 3 :(得分:0)

您需要查看class ::的文档。它所采用的构造函数参数是(hd: B, tl: List[B])

在您的情况下,u变为hdv变为List[In]。而u==v就像做hd.equals(list)一样,会产生错误的结果。

scala> val l= List(List(1,2),List(3,3),List(1),List(1,2,3),List(4,4,4,4))
l: List[List[Int]] = List(List(1, 2), List(3, 3))

scala> l.filter(_ match{
    case u::v =>  Some(u) == v.headOption
    case _ => false
})
res8: List[List[Int]] = List(List(3, 3), List(4, 4, 4, 4))

以上是这种做法的惯用方式。