如何在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是一个字符串。但我只需要这个有效的字符串…不是列表…哦,好的,现在知道了。那么您应该使类型显式。话虽如此,请查看下面我的答案。如果列表中有一个单元,是的,那就是正确的方法。但是,问题中的单位还是字符串还不清楚。如果列表中有一个单位,是的,就是这样。然而,这个问题不清楚是字符串还是单位。