过滤我使用的项目列表:
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")
答案 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