Scala树/图表实施

时间:2016-11-03 10:03:33

标签: algorithm scala

我有一个关于"客户邀请的问题"一个人可以邀请其他人的邀请,只有被邀请的人邀请某人才有效。

为了解决这个问题,我想写一个Tree算法而不是Graph算法。

我试图在Scala中编写这个树结构,这就是我的开始:

case class MyNode(key:Int, children:Option[List[MyNode]] = None)

class MyNodeManager {

  def find(key: Int, tree: Option[List[MyNode]]) = tree match {
    case None => None
    case (h :: t) =>
      println("aa")
    /*if(h.key == key)
        Option(h)
      else
        find(h ::: t)
        */
  }  

}

输入类似于:

val invites = List((1, 2), (1, 3), (3, 6))

我想使用Option [List [MyNode]],因为子项是选项,如果节点已被邀请,我想将值设置为空列表而不是。

树是解决我的问题的最佳结构,还是我应该去Graph或类似的东西(图中的节点可以有多个孩子?)?另一个问题是......那些线(h :: t)和(h ::: t)之间的区别是什么?

以下代码存在编译错误:

Error:(16, 13) constructor cannot be instantiated to expected type;
   found   : scala.collection.immutable.::[B]
   required: Option[List[MyNode]]
    case (h :: t) =>
        ^

如何使用Option [List]?

1 个答案:

答案 0 :(得分:1)

应该是

def find(key: Int, tree: Option[List[MyNode]]) = tree match {
case None => None
case Some(h :: t) =>
  println("aa")
/*if(h.key == key)
    Option(h)
  else
    find(h ::: t)
    */}  

您匹配Option对象而不是元组。 这场比赛并非详尽无遗,因为你缺席了

case Some(Nil) => ....

我发现最好只使用不带Optional的列表。这主要是关于语义的。某些东西是空的。我们有空列表(Nil)的价值,所以我们不需要使用额外的对象来标记这种情况。空列表应该足够了

::: 功能会在列表前添加给定列表的元素。简单地说这个函数用于连接两个列表
:: 是在列表的乞讨处添加元素的功能   另外在Scala中, :: 是一个具有头尾的案例类。如果您想了解有关List实现的更多信息,建议您阅读https://www.amazon.com/Functional-Programming-Scala-Paul-Chiusano/dp/1617290653