2016-05-11 6 views
2

When should I choose Vector in Scala?で読んでいると、ListVectorのどちらを使用するかは、Javaと同じようにScalaでLinkedListまたはArrayListのどちらを使用するかという質問を受けます。ご存知のように、答えは "ほとんどの場合Vector/ArrayList"です。Vectorをデフォルト実装に設定するにはどうすればよいですか?

しかし、ListTraversableの究極のデフォルト実装であり、http://docs.scala-lang.org/tutorials/FAQ/collectionsに従っています。私はそれがベクトルではないと思う "それは遅くパーティーに来た"ため。

  1. Vectorがそれ以上支配的ではないという別の理由がありますか?
  2. IndexedSeqSeqのデフォルトの実装に設定すると、VectorTraversableの最終的なデフォルトの実装になるとは限りませんか?
  3. どうすればいいですか?

答えて

2

scala.mutable.Vectortrie structureに基づいているため、技術的にはjava.util.ArrayListよりもはるかに複雑です。この複雑さは、共通接頭辞を共有するVectorの束よりも、接辞接尾辞を共有するListの束がより軽くなる可能性があることを意味します。

このプロパティは、多くの場合、コレクションを取得し、そのコピーをちょっと修正した操作(多くの場合、stackなど)が多い機能的なスタイルを意味します。大きなVectorに追加すると、いくつかの新しいオブジェクトが生成され、List(常に1)にプリペンドされます。

Listは非常に理解しやすく、理由は簡単です。ただ::またはNilです。 Vectorの実装はかなり隠されている

、それは"dirty" optimisationsを持っており、おそらくStreamがデフォルトSeqの代わりListになりたいdrops

ランダムHaskellの開発を最適化された隠しを指しseq extractors経由preferredly一致させることができました。 scalaz恋人 - more some symmetric Sequenceをstd libにエクスポートします。

Listに基づいての選択を変更することはできません。結果はListBufferchosen newBuilder implementationとなります。しかし、あなたがそう要約

object Seq extends SeqFactory[Seq] { 
    implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]] 
    def newBuilder[A]: Builder[A, Seq[A]] = new VectorBuilder[A] 
} 

のような独自の同様のSeq工場を書き込むことができます。

  1. リンクリストは、他の配列型は別ではるかに有用である可能性関数型言語では、歴史的に最も支配的なコレクション型
  2. ですドメイン
  3. scala.Seq.applyを別の汎用タイプに「切り替える」ことはできません。しかし、名前をSeqで別のオブジェクトをインポートまたは作成することはできます。

私は個人的にVector(...)フォームがよりも便利で簡潔であることがわかります。 Seq(...)またはLinearSeq(...)の代わりにList(...)と同じです。

+0

私の3つのポイントの答えを要約した3つの小数点を書くことができますか?私は(思う)あなたが言っていることを得ている(もう少しそれについて熟考しなければならない)が、実際の答えが私の質問にどのようなものか分からない。 – Make42

1

「パターンを使用するベクトルはほとんどの場合、Javaで使用されていますが、異なるパターン、ツール、ベストプラクティスを使用しているため、scalaでは保持されません。

ほとんどの構造体および変数は不変であり、アルゴリズムはデータのストリームを順次処理する点でほとんどの場合表現されます。これらの2つの観察を念頭において、ほとんどのユースケースに最も適したコレクションの実装は、実際にはリンクされたリストであり、ランダムアクセスコレクションではないと結論付ける必要があります。

したがって、質問#3の短い答えは「しないでください」です。それよりも若干長いバージョンは明示的です。 val seq = IndexedSeq(1,2,3)

関連する問題