2011-07-02 33 views
58

tôi có mã như thế này:Làm thế nào để khai báo danh sách rỗng và sau đó thêm chuỗi trong scala?

val dm = List[String]() 
val dk = List[Map[String,Object]]() 

..... 

dm.add("text") 
dk.add(Map("1" -> "ok")) 

nhưng nó ném java.lang.UnsupportedOperationException runtime.

Tôi cần khai báo danh sách trống hoặc bản đồ trống và một số nơi sau này trong mã cần điền chúng.

+0

Điều gì khiến bạn nghĩ rằng có thao tác 'thêm' trên' Danh sách'? – Debilski

+0

Nếu bạn muốn sử dụng thao tác thêm, bạn sẽ phải khai báo một ArrayList. Vals trong scala cơ bản là bất biến, vì vậy bạn không thể thêm vào chúng. – Phantom73

+1

iirc val là giống như cuối cùng, bạn có thể thêm vào chúng nếu bạn sử dụng Bộ sưu tập có thể thay đổi. ví dụ. http://www.scala-lang.org/api/current/scala/collection/mutable/MutableList.html – DaVinci

Trả lời

86

Danh sách Scala là không thay đổi theo mặc định. Bạn không thể "thêm" một phần tử, nhưng bạn có thể tạo một danh sách mới bằng cách chắp thêm phần tử mới ở phía trước. Vì đây là danh sách mới, bạn cần chỉ định lại tham chiếu (vì vậy bạn không thể sử dụng val).

var dm = List[String]() 
var dk = List[Map[String,AnyRef]]() 

..... 

dm = "text" :: dm 
dk = Map(1 -> "ok") :: dk 

Nhà điều hành :: tạo danh sách mới. Bạn cũng có thể sử dụng cú pháp ngắn:

dm ::= "text" 
dk ::= Map(1 -> "ok") 

NB: Trong scala không sử dụng các loại Object nhưng Any, AnyRef hoặc AnyVal.

+0

Câu trả lời rất hay nhưng bạn có thể nói nếu tôi khai báo danh sách như trong câu trả lời của bạn, chúng thuộc loại scala.collections.mutable hoặc không thay đổi? REPL không làm rõ điều này. – rjc

+2

Theo mặc định. Nếu bạn không nhập gì cả. 'Danh sách' là không thay đổi. Đó là một đề nghị cho hầu hết sử dụng. – paradigmatic

+11

@rjc Scala không có 'mutable.List' -' List' là một loại cụ thể, trong đó việc thực hiện duy nhất là không thay đổi. Có những lớp không thay đổi như 'LinkedList' và' DoubleLinkedList', hầu hết là các lớp trợ giúp. Scala tương đương với Java ArrayList' là 'ArrayBuffer', và tương đương với' LinkedList' của Java là 'ListBuffer'. Đặc điểm tương ứng với 'List' của Java là' Seq' - trong đó có 'collection.Seq' và mở rộng nó,' collection.immutable.Seq' và 'collection.mutable.Seq'. –

2

Mỗi bộ sưu tập mặc định trong scala là không thay đổi, vì vậy bạn có một phương thức + trả về một danh sách mới với phần tử được thêm vào nó. Nếu bạn thực sự cần một cái gì đó giống như phương pháp thêm, bạn cần một bộ sưu tập có thể thay đổi, ví dụ: http://www.scala-lang.org/api/current/scala/collection/mutable/MutableList.html có phương thức + =.

11

Như tất cả mọi người đã đề cập, đây không phải là cách tốt nhất để sử dụng danh sách trong Scala ...

scala> val list = scala.collection.mutable.MutableList[String]() 
list: scala.collection.mutable.MutableList[String] = MutableList() 

scala> list += "hello" 
res0: list.type = MutableList(hello) 

scala> list += "world" 
res1: list.type = MutableList(hello, world) 

scala> list mkString " " 
res2: String = hello world 
+0

Bạn có thể biết danh sách của mình được khai báo như thế nào trong câu trả lời của bạn, nó sẽ cho hiệu năng thời gian chạy tốt hơn trái với câu trả lời bằng mô hình? Giả sử hàng triệu thành phần sẽ được thêm vào danh sách. – rjc

+0

Nó phụ thuộc vào những gì bạn đang cố gắng đạt được. Tôi sẽ khuyên bạn nên bắt đầu với một cái bất biến như @paradigmatic đã gợi ý. Sự phức tạp của việc thêm một phần tử vào một danh sách bất biến như thế này: 'list :: =" text "' là O (1) là hằng số và tốt nhất bạn có thể làm. – agilesteel

+0

rjc: khuyết điểm của danh sách bất biến là O (1); tuy nhiên, điều thực sự quan trọng là mẫu truy cập của bạn đến mức hiệu quả là có liên quan. Ví dụ, nếu thứ tự quan trọng và bạn phải xây dựng danh sách bằng cách nối thêm, Vector là một lựa chọn tốt hơn (không thay đổi). –

16

Nếu bạn cần phải đột biến công cụ, sử dụng ArrayBuffer hoặc LinkedBuffer để thay thế. Tuy nhiên, nó sẽ là tốt hơn để giải quyết các tuyên bố này:

tôi cần phải khai báo danh sách trống hoặc bản đồ trống và một số nơi sau này trong mã cần phải điền họ.

Thay vì làm điều đó, hãy điền vào danh sách có mã trả về các phần tử. Có rất nhiều cách để làm điều đó, và tôi sẽ đưa ra một số ví dụ:

// Fill a list with the results of calls to a method 
val l = List.fill(50)(scala.util.Random.nextInt) 

// Fill a list with the results of calls to a method until you get something different 
val l = Stream.continually(scala.util.Random.nextInt).takeWhile(x => x > 0).toList 

// Fill a list based on its index 
val l = List.tabulate(5)(x => x * 2) 

// Fill a list of 10 elements based on computations made on the previous element 
val l = List.iterate(1, 10)(x => x * 2) 

// Fill a list based on computations made on previous element, until you get something 
val l = Stream.iterate(0)(x => x * 2 + 1).takeWhile(x => x < 1000).toList 

// Fill list based on input from a file 
val l = (for (line <- scala.io.Source.fromFile("filename.txt").getLines) yield line.length).toList 
0

lẽ bạn có thể sử dụng ListBuffers trong scala để tạo danh sách trống và thêm các chuỗi sau đó vì ListBuffers là có thể thay đổi. Ngoài ra tất cả các chức năng Danh sách có sẵn cho ListBuffers trong scala.

import scala.collection.mutable.ListBuffer 

val dm = ListBuffer[String]() 
dm: scala.collection.mutable.ListBuffer[String] = ListBuffer() 
dm += "text1" 
dm += "text2" 
dm = ListBuffer(text1, text2) 

nếu bạn muốn, bạn có thể chuyển đổi này vào một danh sách bằng cách sử dụng ToList

0

Trong trường hợp của bạn tôi sử dụng: val dm = ListBuffer[String]()val dk = ListBuffer[Map[String,anyRef]]()

0

Như đã đề cập trong một trên answer, các Scala List là một bất biến bộ sưu tập. Bạn có thể tạo danh sách trống với .empty[A]. Sau đó, bạn có thể sử dụng phương thức :+, +: hoặc :: để thêm phần tử vào danh sách.

scala> val strList = List.empty[String] 
strList: List[String] = List() 

scala> strList:+ "Text" 
res3: List[String] = List(Text) 

scala> val mapList = List.empty[Map[String, Any]] 
mapList: List[Map[String,Any]] = List() 

scala> mapList :+ Map("1" -> "ok") 
res4: List[Map[String,Any]] = List(Map(1 -> ok)) 
Các vấn đề liên quan