2015-06-30 114 views
1

項目要篩選我使用的物品清單:獲得前過濾器匹配

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

你究竟想做什麼? val l = List(「1」,「2」,「b」,「3」,「b」,「b」)是什麼結果? – Kolmar

+0

@Kolmar更新更清晰嗎? val l = List(「1」,「2」,「b」,「3」,「b」,「b」)應該返回List(「2」,「3」,「b」) –

回答

2

我想這就是你想要的t:

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))

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 
3

,如果你正在尋找所有的產品清單出現在item-that-c​​ontains-「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) 
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)) 
0

如何做到這一點使用滑動和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