ScalaでListに要素を追加する場合、一般的な方法が知りたいです。
取り敢えず下記のようにしています。
lang
1var lst = List[String]() 2lst = lst :+ "aaa" 3lst = lst :+ "bbb" 4print(lst) 5 6List(aaa, bbb)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
Scalaでは可変(mutable)の変数やコレクションを使わないスタイルが推奨されています。
が、この例ではそれを上手く説明できませんので、そのままのを少しだけ簡素にするなら、
lang
1var lst = List[String]() 2lst :+= "aaa" 3lst :+= "bbb" 4print(lst) // => List(aaa, bbb)
と書けます。
Javaのリスト(ArrayList
)に当たるコレクションはArrayBuffer
ですので、これを使ってList
にする方法もあります。
lang
1import scala.collection.mutable.ArrayBuffer 2val a = new ArrayBuffer[String] 3a += "aaa" 4a += "bbb" 5val lst = a.toList 6print(lst) // => List(aaa, bbb)
投稿2015/03/10 14:34
総合スコア9394
0
Scalaをはじめとする関数型プログラミングでは、List(コレクション)に要素を追加する必要がある場合、そのロジックがおかしいのではないかと疑ってください。
コレクションは基本的にImmutable(不変)であるべきです。
また、Listへの要素の追加を表現する場合は、:+
は使わず、::
(cons)を使うのが一般的です。
val lst = "aaa" :: "bbb" :: Nil println(lst) // => List(aaa, bbb)
List同士を連結する必要がある場合は、:::
演算子を使います。
val lst0 = "aaa" :: "bbb" :: Nil val lst1 = "ccc" :: "ddd" :: Nil println(lst0 ::: lst1) // => List(aaa, bbb, ccc, ddd)
Scalaのパターンマッチでは、この::
を用いてListに型をマッチさせることもできますし、再帰的な表現でも非常に便利です。
たとえば、Listを受取って、そのListが空で無ければ先頭の要素を、空の場合はNone
を返す、headOption
という関数をパターンマッチを使って無理やり実装すると、次のようになります。
def headOption(ls: List[Any]): Option[Any] = ls match { case Nil => None case head :: tail => Some(head) } val lst0 = List("aaa", "bbb", "ccc", "ddd") println(headOption(lst0)) // => Some(aaa) val lst1 = List() println(headOption(lst1)) // => None
投稿2015/07/17 11:12
総合スコア19
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。