ProgramingTip

빈 목록을 선언 한 다음 스칼라에 추가하는 방법은 무엇입니까?

bestdevel 2020. 10. 21. 21:16
반응형

빈 목록을 선언 한 다음 스칼라에 추가하는 방법은 무엇입니까?


다음과 같은 코드가 있습니다.

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

.....

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

그러나 런타임 java.lang.UnsupportedOperationException이 발생합니다.

빈 목록이나 빈지도를 선언해야하며 나중에 코드에서 채워야하는 일부도 있습니다.


스칼라 목록은 기본적으로 설명 수 없습니다. 요소를 "추가"할 수 없지만 새 요소를 추가하여 새 목록을 만들 수 있습니다. 그것이이기 때문에 새로운 목록, 당신은 (당신이 발을 사용할 수 있습니다) 참조를 다시 할당해야합니다.

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

.....

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

운영자 ::는 새 목록을 만듭니다. 더 짧은 구문을 사용할 수 있습니다.

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

NB : 에이 형식을 사용하지 않는 스칼라 Object하지만 Any, AnyRef또는 AnyVal.


항목을 변경해야하는 경우 ArrayBuffer또는 LinkedBuffer대신 사용하십시오. 그러나 다음은 다루는 것이 좋습니다.

빈 목록이나 빈지도를 선언해야하며 나중에 코드에서 채워야하는 일부도 있습니다.

대신 요소를 반환하는 코드로 목록을 채우십시오. 이를 수행하는 방법에는 여러 가지가 있고 몇 가지 예를 들어 보겠습니다.

// 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


모두가 이미 언급했듯이 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

스칼라의 기본 컬렉션은 추가 된 새 목록을 반환하는 + 메소드가 있습니다. add 메소드와 같은 것이 필요한 경우 + = 메소드가있는 http://www.scala-lang.org/api/current/scala/collection/mutable/MutableList.html 과 같이 변경 가능한 수집이 필요합니다 .


에서 언급 한 이상 바와 같이 대답스칼라 목록 불변의 모음입니다. 를 사용하여 빈 목록을 만들 수 있습니다 . 그런 다음 당신은 방법을 사용할 수 있습니다. , 또는 목록에 요소를 추가하기 위해서입니다..empty[A]:++:::

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))

스칼라에서 ListBuffers를 사용하여 빈 목록을 만들고 나중에 문자열을 추가 할 수 있습니다. ListBuffer는 변경 가능하기 때문입니다. 또한 모든 List 함수는 스칼라의 ListBuffer에 사용할 수 있습니다.

import scala.collection.mutable.ListBuffer 

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

원하는 경우 .toList를 사용하여 이것을 목록으로 변환 할 수 있습니다.


귀하의 경우에는 내가 사용 val dm = ListBuffer[String]()하고val dk = ListBuffer[Map[String,anyRef]]()

참고 URL : https://stackoverflow.com/questions/6557169/how-to-declare-empty-list-and-then-add-string-in-scala

반응형