如何在scala中从列表(List(List())中删除空案例?
我只需要列表中的有效值,例如如何在scala中从列表(List(List())中删除空案例?,scala,collections,Scala,Collections,我只需要列表中的有效值,例如 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(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
您提供的示例并不十分清楚,但我认为一些扁平化可能会有所帮助:
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)
您提供的示例并不十分清楚,但我认为一些扁平化可能会有所帮助:
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)
我必须向@Gabriele answer添加collect以获得所需的结果
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)
您也可以使用过滤器而不是收集 我必须在@Gabriele answer中添加collect才能得到想要的结果
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)
您也可以使用过滤器而不是收集 如果编写这样的递归方法,则无论嵌套如何,都可以提取字符串。仅当所有对象嵌套到相同深度时,“展平”才起作用
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
}
也就是说,这是一种奇怪的数据存储方式
注意:所有decomposemore调用都是尾部递归的,因此不会出现堆栈溢出问题。decomposel是一种普通的递归方法,因此如果列表嵌套深度超过一千层左右,则可能需要使用另一种方法,例如基于堆的广度优先搜索。如果编写这样的递归方法,则可以不考虑嵌套方式而提取字符串。仅当所有对象嵌套到相同深度时,“展平”才起作用
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
}
也就是说,这是一种奇怪的数据存储方式
注意:所有decomposemore调用都是尾部递归的,因此不会出现堆栈溢出问题。decomposel是一种普通的递归,因此,如果列表嵌套的深度超过一千层左右,您可能希望使用另一种方法,例如基于堆的广度优先搜索。这就是:语法?除非它是您的自定义运算符,否则它看起来不像是有效的scala代码。我首先展示的是我现在得到的…经过一些计算后得到的。因此,只有真正的案例价值才会产生。置信度:66.0是通过该计算得出的。整行书橡皮擦->笔,信心:66.0是一个字符串。但我只需要这个有效的字符串…不是列表…哦,好的,现在知道了。那么您应该使类型显式。话虽如此,请查看我下面的答案。这是关于:语法?除非它是您的自定义运算符,否则它看起来不像是有效的scala代码。我首先展示的是我现在得到的…经过一些计算后得到的。因此,只有真正的案例价值才会产生。置信度:66.0是通过该计算得出的。整行书橡皮擦->笔,信心:66.0是一个字符串。但我只需要这个有效的字符串…不是列表…哦,好的,现在知道了。那么您应该使类型显式。话虽如此,请查看下面我的答案。如果列表中有一个单元,是的,那就是正确的方法。但是,问题中的单位还是字符串还不清楚。如果列表中有一个单位,是的,就是这样。然而,这个问题不清楚是字符串还是单位。