web-dev-qa-db-ja.com

Scalaのリストの最後に要素を追加する

それはばかげた質問のように思えますが、私がインターネットで見つけたのはゴミだけでした。単にT型の要素をリストList[T]に追加することはできません。私はmyList ::= myElementを試しましたが、それは奇妙なオブジェクトを作成し、myList.lastにアクセスすると常にリストの中に置かれた最初の要素を返します。

197
Masiar
List(1,2,3) :+ 4

Results in List[Int] = List(1, 2, 3, 4)

この操作はO(n)の複雑さを持つことに注意してください。この操作が頻繁に必要な場合、または長いリストの場合は、別のデータ型(ListBufferなど)を使用することを検討してください。

357
Landei

それはあなたがそれをするべきではないからです(少なくとも不変のリストで)。もしあなたが本当に本当にデータ構造の最後に要素を追加する必要があり、このデータ構造が本当に本当にリストである必要があり、このリストが本当に本当に不変でなければならないなら、これをそれぞれ行ってください:

(4 :: List(1,2,3).reverse).reverse

またはその:

List(1,2,3) ::: List(4)
64
agilesteel

Scalaのリストは修正するようには設計されていません。実際、Scalaに要素を追加することはできません List ;これは、不変データ構造です。これは、Java Stringのようなものです。 Scalaで「要素をリストに追加する」ときに実際にすることは、既存のリストから新しいリストを作成することです(ソース)

このようなユースケースにリストを使用する代わりに、 ArrayBuffer または ListBuffer を使用することをお勧めします。これらのデータ構造は新しい要素を追加するように設計されています。

最後に、すべての操作が完了したら、バッファをリストに変換できます。次のREPLの例を参照してください。

scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

scala> var fruits = new ListBuffer[String]()
fruits: scala.collection.mutable.ListBuffer[String] = ListBuffer()

scala> fruits += "Apple"
res0: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple)

scala> fruits += "Banana"
res1: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana)

scala> fruits += "Orange"
res2: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana, Orange)

scala> val fruitsList = fruits.toList
fruitsList: List[String] = List(Apple, Banana, Orange)
18
Markus Weninger

これは、答えの1つに似ていますが、方法が異なります。

scala> val x=List(1,2,3)
x: List[Int] = List(1, 2, 3)

scala> val y=x:::4::Nil
y: List[Int] = List(1, 2, 3, 4)
2
Venkat

2つのリストまたはリストと配列を追加または追加することができます
Append:

var l = List(1,2,3)    
l=l:+4 
Result : 1 2 3 4  
var ar = Array(4,5,6)    
for(x<-ar)    
{ l=l:+x}  
  l.foreach(println)

Result:1 2 3 4 5 6

前追加:

var l = List[Int]()  
   for(x<-ar)  
    { l=x::l } //prepending    
     l.foreach(println)   

Result:6 5 4 1 2 3
1