Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何获取树状自定义对象的大小_Scala_Size_Foldleft - Fatal编程技术网

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