【问题标题】:ListNode implementation in scalascala中的ListNode实现
【发布时间】:2016-03-24 09:09:01
【问题描述】:

您好,我是 Scala 的新手,想知道如何将简单的 ListNode 类从 Java 重写为 Scala。

在java中如下所示,我可以创建一个头节点head = new ListNode(0),然后设置head.next = new ListNode(1) >

// Java code
public class ListNode {
    public int val;       // data stored in this node
    public ListNode next;  // link to next node in the list

    public ListNode(int data) {
        this.val = data;
    }
}

但我发现在Scala中重写相同的逻辑很难,下面是ListNode的一个案例类

// Scala code
case class ListNode[T](vl: T, nt: ListNode[T]) {
    def value: T = vl
    def next: ListNode[T] = nt
}

当我试图实例化一个头节点时它失败了,并实例化另一个新节点并将 head.next 设置为它:

scala> val head = ListNode(1, Nil)
<console>:9: error: type mismatch;
 found   : scala.collection.immutable.Nil.type
 required: ListNode[?]
       val head = ListNode(1, Nil)

我正在考虑将“下一个列表节点”放入 Option[] 中,以处理 null 情况,但它似乎变得越来越复杂......在 Scala 中是否有一种简单而正确的方法来做到这一点?

非常感谢。

【问题讨论】:

    标签: java scala scala-collections


    【解决方案1】:

    您正在混合特征定义和实际值。我认为您需要的 scala 代码只是:

    case class ListNode[T](value: T, next: ListNode[T] = null)
    

    根据用例,您可能希望将 next 更改为 Option[ListNode[T]] 和/或如果您希望它是可变的,则将其定义为 var next

    【讨论】:

      【解决方案2】:

      你的意思是null,而不是NilNilscala.collection.immutable.List,但 ListNode 构造函数不想要那个,它想要一个 ListNode

      null 是否是表示空列表的最佳方式是另一个问题,但这就是您在 Java 代码中所做的(next 默认为 null),所以如果您尝试做的只是完全相同Scala 中的东西,继续使用 null。

      【讨论】:

      • 一点也不!在 Scala 中,我们有 nullNullNothingNilNone...更不用说 Unit 这也是一无所有...没有人也没有人可以保留这个一开始一切顺利,相信我。
      【解决方案3】:

      这是一种在 Scala 中实现列表节点的方法。如果您愿意,您可以轻松地将 null 替换为 Option[ListNode[T]]

      trait ListNode[T]{
        def value: T
        def next: ListNode[T]
      }
      
      object ListNode{
      
        def apply[T](item: T): ListNode[T] = new SingletonNode(item)
      
        def apply[T](item: T, next: Option[ListNode[T]]): ListNode[T] = next match {
          case Some(node) => new Node[T](item, node)
          case _ => new SingletonNode(item)
        }
      
        def apply[T](item: T, next: ListNode[T]): ListNode[T] = new Node[T](item, next)
      
        private case class SingletonNode[T](override val value: T) extends ListNode[T]{
          val next: ListNode[T] = null
        }
      
        private case class Node[T](override val value: T,
                                   override val next: ListNode[T]) extends ListNode[T]
      }
      

      一些示例用法

      val ln1 = ListNode(1)
      val ln2 = ListNode(1,ln1)
      val ln3 = ListNode(10, ln2)
      

      【讨论】:

      • 感谢选项演示!
      猜你喜欢
      • 2016-01-11
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多