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
Java scala中ListNode的实现_Java_Scala_Scala Collections - Fatal编程技术网

Java scala中ListNode的实现

Java scala中ListNode的实现,java,scala,scala-collections,Java,Scala,Scala Collections,嗨,我是Scala的新手,想知道如何将一个简单的ListNode类从Java重写到Scala 在java中,它如下所示,我可以创建一个head节点head=newlistnode(0),然后设置head.next=newlistnode(1) 但我发现很难在Scala中重写相同的逻辑,下面是ListNode的case类 // Scala code case class ListNode[T](vl: T, nt: ListNode[T]) { def value: T = vl

嗨,我是Scala的新手,想知道如何将一个简单的ListNode类从Java重写到Scala

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

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

// Scala code
case class ListNode[T](vl: T, nt: ListNode[T]) {
    def value: T = vl
    def next: ListNode[T] = nt
}
当我尝试实例化一个head节点,并实例化另一个新节点并设置head时失败。在它旁边:

scala> val head = ListNode(1, Nil)
<console>:9: error: type mismatch;
 found   : scala.collection.immutable.Nil.type
 required: ListNode[?]
       val head = ListNode(1, Nil)
scala>val head=ListNode(1,Nil)
:9:错误:类型不匹配;
找到:scala.collection.immutable.Nil.type
必需:ListNode[?]
val head=ListNode(1,无)
我正在考虑将“下一个列表节点”放入选项[],以处理空情况,但它似乎变得越来越复杂……在Scala中是否有一种简单而正确的方法来实现这一点


非常感谢。

你的意思是
null
,而不是
Nil
Nil
是一个
scala.collection.immutable.List
,但是
ListNode
构造函数不需要它,它需要一个
ListNode


null是否是表示空列表的最佳方式是另一个问题,但这是您在Java代码中所做的(
next
默认值为null),因此,如果您在Scala中所做的只是完全相同的事情,请继续使用null。

以下是一种可以在Scala中实现列表节点的方法。如果愿意,您可以轻松地用
选项[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)

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

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

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

感谢选项演示!一点也不!在Scala中,我们有
null
null
Nothing
Nil
,和
None
。。。更不用说
单元
,它也是一个什么都没有的。。。相信我,没有人,也没有人能一开始就把这一切都搞清楚。
case class ListNode[T](value: T, next: ListNode[T] = null)