scala中的ListNode实现

时间:2015-12-17 19:08:29

标签: java scala scala-collections

您好我是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)

我想把&#34;下一个列表节点&#34;进入Option [],处理空案例,但似乎变得越来越复杂......在Scala中有一个简单而正确的方法吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您的意思是null,而不是NilNilscala.collection.immutable.List,但ListNode构造函数不想要它,它需要ListNode

null是否是表示空列表的最佳方式是另一个问题,但这是你在Java代码中所做的(next默认为null),所以如果你所有的话都是这样的话。重新尝试做的事情与Scala完全相同,请继续使用null。

答案 2 :(得分:1)

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

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)