2014-10-20 111 views
1

我想從列表中唯一有效的值(表(表())),例如,如何從scala中的List(List(List()))中刪除空案例?

List(List(List(())), List(List(())), List(List(())), List(List(())), List(List(())), List(List(book eraser -> pen , confidence :66.0))) 
List(List(List(())), List(List(Ink -> pen eraser , confidence :100.0)), List(List(())), List(List(pen Ink -> eraser , confidence :100.0)), List(List(())), List(List(Ink eraser -> pen , confidence :100.0))) 

我只需要內部的琴絃,

book eraser -> pen , confidence :66.0 
Ink -> pen eraser , confidence :100.0 
pen Ink -> eraser , confidence :100.0 
Ink eraser -> pen , confidence :100.0 
+0

這是用':'語法嗎?除非它是你的自定義操作符,否則它看起來不像有效的scala代碼。 – 2014-10-20 11:39:42

+0

我第一次展示的是我現在得到的......它經過了一些計算。所以只會產生真實的情況值。從這個計算中得到了「自信:66.0」。整行「書橡皮擦 - >筆,自信:66.0」是一個字符串。但我只需要這個有效的字符串...不是列表(...( – rosy 2014-10-20 11:43:29

+1

噢好吧,現在就明白了,你應該明確地表明這種類型,這就是說,看看我的回答如下: – 2014-10-20 11:52:25

回答

2

如果你寫這樣的話,你可以拉出琴絃不管嵌套的遞歸方法。 (flatten只有當一切都嵌套到相同深度的作品。)

def allStrings[A](xs: List[A]): List[String] = { 
    val ss = List.newBuilder[String] 
    def decompose(xs: List[_]) { xs match { 
    case (s: String) :: more => ss += s; decompose(more) 
    case (l: List[_]) :: more => decompose(l); decompose(more) 
    case x :: more => decompose(more) 
    case Nil => 
    }} 
    decompose(xs) 
    ss.result 
} 

這就是說,這是存儲數據的奇怪的方式。 (注意:所有的decompose(more)調用都是尾遞歸的,所以你不會有堆棧溢出的問題,decompose(l)是正常的遞歸,所以如果你的列表嵌套超過一千層左右,你可能想要做一個不同的方式(例如基於堆的寬度優先搜索)。)

2

您提供的例子並不十分清楚,但我看起來像一對夫婦的flatten可能幫助:

val a = List(List(List()), List(List("book eraser -> pen , confidence :66.0")), List(List())) 
a.flatten.flatten // List[String] = List(book eraser -> pen , confidence :66.0) 
1

我不得不收集添加到@Gabriele答案得到期望的結果。

scala> List(List(List(())), List(List("Ink -> pen eraser , confidence :100.0")), List(List(())),List(List("pen Ink -> eraser , confidence :100.0")), List(List(())), List(List("Ink eraser -> pen , confidence :100.0"))) 
res0: List[List[List[Any]]] = List(List(List(())), List(List(Ink -> pen eraser ,confidence :100.0)),List(List(())), List(List(pen Ink -> eraser , confidence :100.0)), List(List(())),List(List(Ink eraser -> pen , confidence :100.0))) 

scala> res0.flatten.flatten.collect{case str: String => str} 
res1: List[String] = List(Ink -> pen eraser , confidence :100.0, pen Ink -> eraser , confidence :100.0, Ink eraser -> pen , confidence :100.0) 

scala> val a = List(List(List(())), List(List("Ink -> pen eraser , confidence :100.0")), List(List(())), List(List("pen Ink -> eraser , confidence :100.0")), List(List(())), List(List("Ink eraser -> pen , confidence :100.0"))) 
scala> res0.flatten.flatten.collect{case str: String => str} 
res4: List[String] = List(Ink -> pen eraser , confidence :100.0, pen Ink -> eraser , confidence :100.0, Ink eraser -> pen , confidence :100.0) 

取而代之的收集,你也可以使用過濾器(_!=())

+2

萬一有' Unit'在列表中,是的,這是一條可行的路線,但是不清楚'()'是否是一個String或Unit'' – 2014-10-20 13:13:58

+0

是的,你說得對,謝謝指出。 – mohit 2014-10-20 15:45:00

相關問題