使用SPAN函数将Scala中的地图划分为一分为二



i有一个我正在使用的 */]的表格的映射[int,option [/*的某种类型的映射,因此:

scala> val t1: Map[Int,Option[(String,List[Int])]] = Map(500->Some("A",List(1,2,3)))
t1: Map[Int,Option[(String, List[Int])]] = Map(500 -> Some((A,List(1, 2, 3))))
scala> t1 + (400 -> Some("B",List(9,8,7))) + (300 -> None) + (200 -> None)
res6: scala.collection.immutable.Map[Int,Option[(String, List[Int])]] = Map(500 -> Some((A,List(1, 2, 3))), 400 -> Some((B,List(9, 8, 7))), 300 -> None, 200 -> None)

现在,我试图将所有空的值分开,一个具有所有空值-From from key/value - 而另一个没有它们,因此:

res6.span(e => e._2.isEmpty)
res7: (scala.collection.immutable.Map[Int,Option[(String, List[Int])]], scala.collection.immutable.Map[Int,Option[(String, List[Int])]]) = (Map(),Map(500 -> Some((A,List(1, 2, 3))), 400 -> Some((B,List(9, 8, 7))), 300 -> None, 200 -> None))

我不明白为什么我在左侧得到空的地图,而<k,>对右侧的地图中充满幸福。他们应该在左边的地图中,或者我期望。

我缺少什么明显的东西?

您应该使用partition而不是span

注意:c span p等于(但可能比((c在p,c dropthile p时更有效(,前提是对谓词p的评估不会引起任何副作用。

因此,如果未满足条件,span将停止扫描。

例如,

scala> val l = List(1, 9, 8, 0)
scala> l.span(e => e < 2)
res7: (List[Int], List[Int]) = (List(1),List(9, 8, 0))
scala> l.partition(e => e < 2)
res8: (List[Int], List[Int]) = (List(1, 0),List(9, 8))

请注意,实际上,对于span,除非订购基础收集类型,否则它可能会返回不同的运行结果。

在您的情况下, map 中的第一个元素可能不会 None。(未订购Map(

按照定义使用span时,我们获得了与原始集合相同类型的序列的Tuple2,其中一个包含true值和其他false值。

 def span(p: A => Boolean): (Repr, Repr) = 

在您的情况下

res6.span(e => e._2.isEmpty)

因此,在您的情况下,您有一个 emptynon-empty tuple2的元素。

如果您想获得non-empty值,则只需使用_2用作

val nonEmptyValue = res6.span(e => e._2.isEmpty)._2

最新更新