过滤器匹配前获取项目

时间:2015-06-30 11:46:09

标签: scala

过滤我使用的项目列表:

  val l : List[String] = List("1","a","2","b")

  l.filter(c => c.contains("b")).foreach(println)

但是如何访问匹配项目之前出现的项目?所以在这种情况下" 2"是访问?

更新:

 List("1","a","2","b","3","b","4","b")
filtering on "b" returns 
List("2","3","4")
filtering on "a" returns
List("1")

5 个答案:

答案 0 :(得分:3)

如果您要查找项目之前出现的所有项目的列表 - 包含 - “b”:

def prevItems(l: List[String]) = 
  l.sliding(2)
   .filter{ case List(a, b, _*) => b.contains("b"); case _ => false }
   .map{ x => x(0) }
   .toList

val list1 = List("1","a","2","b")
prevItems(list1)
// List(2)

val list2 = List("b", "a", "b")
prevItems(list2)
// List(a)

val list3 = List("1", "2", "b", "3", "b", "b")
prevItems(list3)
// List(2, 3, b)

答案 1 :(得分:2)

您的描述有点神秘,但我认为您需要在第一次匹配之前出现的元素列表 - 例如,包含" b"的第一个元素之前的所有元素。

如果是,请使用takeWhile

scala> val l = List("1","a","2","b")
l: List[String] = List(1, a, 2, b)

scala> l takeWhile {! _.contains("b")}
res0: List[String] = List(1, a, 2)

如果您希望元素出现在包含" b"的第一个元素之前:

scala> l.takeWhile{! _.contains("b")}.last
res1: String = 2

答案 2 :(得分:2)

我认为这就是你想要的:

val x = l.tail.foldLeft(l.head, (List.empty[(String, String)]))((x,c) => if(c.contains("b")) (c, (x._1, c):: x._2) else (c, x._2))._2

val ans = if(l.head.contains("b")) (null, l.head.contains("b")) :: x    else x

输出为List((2,b))

答案 3 :(得分:0)

这是一个解决方案

代码:

 val list = List("1", "2", "b", "3", "b", "b")

 list.zip(list.tail).filter(p=>p._2 .equalsIgnoreCase("b") ).foreach(f=>println(f._1))

答案 4 :(得分:0)

如何使用sliding和flatMap来完成此操作。

val list = List("1", "2", "b", "3", "b", "b")
val target = "b"
list.sliding(2).flatMap{ 
   case Seq(x,y) => if(y == target) Some(x) else None 
   case _ => None
}.toSeq