2016-12-07 8 views
0

私はScalaでLinkedListを実装しようとしています。ScalaのLinkedList

主な問題は約Nullです。

しかし、最初のいくつかのコード:

class Node(xkey: String, xnext: Option[Node], xinfo: Int) { 
    val key: String = xkey; 
    var next = xnext.getOrElse(None); 
    var info: Int = xinfo; 

    def this(xkey: String, xinfo: Int) { 
    this(xkey, None, xinfo); 
    } 

    def this(xkey: String) { 
    this(xkey, None, -1); 
    } 

    @Override 
    override def toString: String = key + ":" + info 
} 

この時点で、私はすでに、物事が心配です。 のテールには、次のものがないので、xnextOption[Node]として構成すると宣言します。

私の最初の試みでは、それはちょうどNodeでしたが、コンパイラが "nullはノードにキャストできません"と言ったのでnullオブジェクトに問題がありました。私はこのオプションに切り替えます。

でも、大丈夫ですか?あなたが知っているので、私のために次にでなく、Optionでなければなりません。そうでなければ、わかりません。linkedList次のノードへの参照方法。

が何であれ、第二のクラス(つまり私のリンクリスト)

class LinkedNode { 

    private var first: Option[Node] = None; 
    private var last: Option[Node] = None; 

    def addNode(newNode: Node) = { 
    if (first == null) { 
     first = Some(newNode); 
     last = Some(newNode); 
     first.next = last; 
    } 
    else { 
     last.next = newNode; 
     newNode.next = null; 
     last = newNode 
    } 
    } 

    def size(): Long = { 
    var currentNode : = first; 
    var size = 0L; 
    while (currentNode != null) { 
     size+=1; 
     currentNode = currentNode.next; 
    } 
    size 
    } 

    def findNodeByKey(key: String) : Node = { 
    var currentNode = first; 
    while(currentNode != null) { 
     if (currentNode.key.equals(key)) 
     currentNode 
     else { 
     currentNode = currentNode.next; 
     } 
    } 
    currentNode; 
    } 

    def delNodeByKey(key : String) : Boolean = { 
    var currentNode = first; 
    var previousNode = first; 
    while(currentNode != null) { 
     if (currentNode.key.equals(key)) { 
     previousNode = currentNode.next; 
     return true; 
     } 
     previousNode = currentNode; 
     currentNode = currentNode.next; 
    } 
    return false; 
    } 


} 

、何も。私はすでに最初と最後に私のコンストラクタにブロックしています。

どうすればいいですか? Node?またはOption[Node]
問題はAddメソッドにもあります。
ノードを追加するときにNodeオブジェクトを追加したいのですが、Option[Node]というオブジェクトは追加しません。
そして、私はすべてOption,SomeおよびNoneクラスで私が望むものを達成する方法を手に入れません。

私は私の要求であまりにも曖昧であってはいけないと知っていますが、何か助けてください。

P.S.私はすでにthis Q/Aを読みましたが、それは私を助けませんでした

答えて

3

この時点で、私はすでに物事を心配しています。このlinkedListの末尾にはnextがないので、Option [Node]として構造体にxnextを宣言します。 [...] でも、大丈夫ですか?あなたが知っているので、次に私はノードでなければならない、オプションではない、そうでなければ、私はリンクリストでどのように次のノードへの参照を知らない。

これは、あなたは間違いなく、ヌル・ポインタ例外などを防ぐためにやりたいnullを、交換に良い解決策です。 Option[Node]は、単にNodeがコンテナ(またはNone)にラップされています。値がisEmptyであるかどうかを確認したり、値がget(オプションが空の場合は例外をスローします)で値を取得します。明示的

nullへの唯一の違いに、あなたはJavaでそれを使用したいと、あなたはそれの代わりにnullをチェックするisEmptyかどうかを確認する必要があるということです、そしてあなたは(option.get)をアンラップする必要があること、それはあなたが確信していますそれはNoneではありません。オプションから値を取得する

よりパラダイム(スカラ-典型的な)方法は、パターンマッチングである:

option match { 
    case Some(x) => println(x) 
    case None => println("Whoops, no value :(") 
} 

あなたの他の質問については、彼らは確かに少し漠然としています。

どのように私はそれらをdeclere?ノード?またはOption [Node]?

使用Option[Node]可能性が変数に値がないことを存在している場合(つまり、あなたはJavaで時々nullに設定したい場合)。

ノードを追加するときに、Option [Node]ではなくNodeオブジェクトを追加したいとします。

はありません、あなたはノードが設定されているかどうか後で確認する必要がありますので、内部Option[Node]を追加します。 Scalaでは、Option[Node].isEmptyでこれを行うのが、nullに設定するよりも優先されます。 Some(newNode)(これは「オプションでノードをラップする」と呼ばれますが、正しい用語であるかどうかは完全にはわかりません)では、コードの一部(たとえば、addNode)でこれを実行しています。 。

私はすべてのOption、Some、Noneクラスで必要なものを達成する方法を得られません。

は何があなたのaddNodeでやっていることは程度に正しいように見えるんが、何とかelseブランチで再びnullを使用するようにしてください。何について:

// We don't need Option[Node] for the parameter, because there 
// _must_ be a Node value to be added 
def addNode(newNode: Node) = { 
    if (first.isEmpty) { 
     first = Some(newNode) 
     last = Some(newNode) 
     first.next = last 
    } else { 
     newNode.next = None 
     last.next = Some(newNode) 
     last = Some(newNode) 
    } 
} 

(私はそのコードを実行しなかった、でも私はあなたのロジックの完全なチェックをしました)

+1

ありがとうございます。あなたは本当に私を助ける説明。 –