18

これをチェックしてください

import scala.collection.mutable.LinkedList

var l = new LinkedList[String]

l append LinkedList("abc", "asd")

println(l)
// prints 
// LinkedList()

しかし

import scala.collection.mutable.LinkedList

var l = new LinkedList[String]

l = LinkedList("x")
l append LinkedList("abc", "asd")

println(l)
// prints 
// LinkedList(x, abc, asd)

2 番目のコード スニペットは機能するのに、最初のコード スニペットは機能しないのはなぜですか? これはScala 2.10にあります

4

2 に答える 2

3

私が理解しているように、それはリスト内の最初/最後の ( Nil) 要素に関連しています (リストが空の場合、Nil最初と最後の要素が同時に存在します)。

LinkedList (まだ) は「プリミティブ チャーム」戦略に従います。したがって、Nil{Nil, newElement}. (結局Nil最後の要素にする必要があります)

もちろん、ifリストが空であることを確認addingListしてから、最初とNil最後に配置することもできます。しかし、これは「賢すぎる」と思います。

しかし、とにかく、次のappend()ような「期待する」結果を返します。

val addingList = new LinkedList[String]("a", "b")
val result = emptyList append addingList

result = {"a", "b"}.この場合、「addingList」自体を返しますが、初期リストは変更しません。

newElement をnextref に割り当てようとすると、次のようになります。

   emptyList.next = LinkedList("whatever")

その結果、emtyList は次のように変更されます。

 LinkedList(null, whatever)

つまり、最初の要素を null として作成しますnext()。これは、新しい/次の要素の割り当てを使用しているためです。したがって、null である最初の要素には、追加した新しい要素 ( addingElelement) への次の参照があるため、Nil を最後に移動します。

なぜなら

「「emptyList」は「ヘッド」リンクでもあります」

この場合の head は head ですがNilNillnext を持つことはできないため、 new への next() 参照を使用して新しい最初の要素 (null 値を持つ) を作成する必要がありますaddingElelement

個人的には、「あまりにも原始的」であり、「エレガント」ではないと思います。しかし、それは依存していると思います。

タスク指向のストーリー:

私の最初の仕事のために(なぜ私はこの「奇妙な」リストの振る舞いについて考え始めたのですか[それは可変ですが])-私はDictionaryそれを保持するために呼び出されるクラス/オブジェクトに可変リストを使用したかっWordsたです(デフォルトでは辞書には単語がありません)。ddWord(wod:String)そして、新しい単語を追加するための のようなメソッドが必要です。今のところ、私の実装は変更されます (私はこれを使用するつもりはありませんLinkedListが、むしろを使用しますMutableList。以前のものよりも変更可能であるようです):

object Dictionary {

  val words = new mutable.MutableList[Word]();

  def addWord(word: Word): Unit = {
    words += word;
  }

}

しかし、可能な実装は次のようになります。

object Dictionary {

  var words = new mutable.LinkedList[Word]();

  def addWord(word: Word): Unit = {

    if (words.isEmpty) {
      words = words append( mutable.LinkedList[Word](word) ) // rely on append result
    } else {
      words append( mutable.LinkedList[Word](word) )
    }

  }

}

しかし、var代わりにを使用する必要があり、すべての新しいWordを にval変換する必要があり、ロジックがより複雑になりました。LinkedList

于 2013-05-26T18:44:37.130 に答える