Scala 如何获取树状自定义对象的大小
我试图找出如何获得自定义树状数据结构的大小(“级别”的数量),定义如下:Scala 如何获取树状自定义对象的大小,scala,size,foldleft,Scala,Size,Foldleft,我试图找出如何获得自定义树状数据结构的大小(“级别”的数量),定义如下: case class PrefixTreeImpl[K, +V](value: Option[V], prefixTree: Map[K, PrefixTree[K, V]]) extends PrefixTree[K, V] 如您所见,它实现了PrefixTree接口(实际上是trait),其中包括size()方法: def size: Int 我试图用foldLeft()Scala方法实现它,但我不太明白它是如何处
case class PrefixTreeImpl[K, +V](value: Option[V], prefixTree: Map[K, PrefixTree[K, V]]) extends PrefixTree[K, V]
如您所见,它实现了PrefixTree
接口(实际上是trait),其中包括size()
方法:
def size: Int
我试图用foldLeft()Scala方法实现它,但我不太明白它是如何处理这种复杂的数据结构的
到目前为止,我想到了这一点,并陷入困境:
override def size: Int = {
if (prefixTree.isEmpty) 0
else
prefixTree.foldLeft(0) {(z, Map[K, PrefixTree[K, V]]()) => z + 1}
}
显然,它没有编译,但我还不能想出其他东西
DS的工作方式是:
in:scala>val tree2=tree1.put(列表(“一”、“两”),12)
输出:
PrefixTreeImpl(无,Map(一)->PrefixTreeImpl(无,Map(二)->PrefixTreeImpl(一些(12),Map(树)->PrefixTreeImpl(一些(123),Map())))))
可以用下一种方式递归完成:
override def size: Int = {
if(prefixTree.nonEmpty) prefixTree.values.map(_.size + 1).max else 0
}
所以下一个测试:
val tree = PrefixTreeImpl(None ,Map("one" -> PrefixTreeImpl(None, Map("two" -> PrefixTreeImpl(Some(12),Map("tree" -> PrefixTreeImpl(Some(123), Map.empty[String, PrefixTree[String, Int]])))))))
println(tree.size)
生成结果:3
希望这有帮助 大家好,欢迎来到Stackoverflow!使用
foldLeft
是一项严格的要求?这非常接近我所需要的,非常感谢!经过一些细微的修改,它工作得很好Hey Ivan,我已经思考了一天左右的问题,并提出了另一个问题:如果我需要计算存储选项[V]值的数量,而不是“级别”,我将如何处理相同的问题?@Burn_jacks你可以尝试一下sum
而不是max
:如果(prefixTree.nonEmpty)prefixTree.values.map(xtree.size+1).sum else 0
但在这种情况下,结果将是“3”,而预期的结果是“2”,不是吗?@Burn_jacks是的,对不起。正确的一个:val count=value.fold(0)(=>1)if(prefixTree.nonEmpty)count+prefixTree.values.map(xtree.size).sum else count