[arrays] Scala : 배열에 요소를 추가하는 가장 좋은 방법은 무엇입니까?

말 나는이 Array[Int]같은

val array = Array( 1, 2, 3 )

이제 4다음 예제와 같이 값을 배열에 추가하고 싶습니다 .

val array2 = array + 4     // will not compile

물론 System.arraycopy()이 작업을 직접 사용 하고 수행 할 수 있지만이를위한 Scala 라이브러리 함수가 있어야합니다. 단순히 찾을 수 없습니다. 어떤 조언을 해주셔서 감사합니다!

노트:

  1. 다음 줄과 같이 요소의 다른 배열을 추가 할 수 있지만 너무 둥글게 보입니다.

    val array2b = array ++ Array( 4 )     // this works
  2. 나는 List vs Array의 장점과 단점을 알고 있으며 여기에서는 Array 확장에 특히 관심이있는 여러 가지 이유로 여기에 있습니다.

편집 1

:+운영자 방법을 가리키는 답변에 감사드립니다 . 이것이 제가 찾던 것입니다. 안타깝게도 사용자 정의 append () 메서드 구현보다 속도가 느립니다 arraycopy-약 2 ~ 3 배 느립니다. 에서 구현을 보면 SeqLike[]빌더가 생성되고 배열이 추가 된 다음 빌더를 통해 추가가 완료된 다음 빌더가 렌더링됩니다. 배열에 대한 좋은 구현이 아닙니다. 두 가지 방법을 비교하는 빠른 벤치 마크를 수행하여 10주기 중 가장 빠른 시간을 확인했습니다. 어떤 클래스의 8 개 요소 배열 인스턴스에 단일 항목 추가를 1,000 만 번 반복하면 다음 을 사용 하는 간단한 방법으로 Foo3.1 초 :+, 1.7 초가 걸립니다.append()System.arraycopy();Long의 8 개 요소 배열에 대해 1,000 만 개의 단일 항목 추가 반복을 수행 :+하려면 간단한 append()방법으로 2.1 초 , 0.78 초가 걸립니다 . 에 대한 사용자 정의 구현으로 라이브러리에서 수정할 수 없는지 궁금 Array하십니까?

편집 2

그만한 가치를 위해 티켓을 제출했습니다 :
https://issues.scala-lang.org/browse/SI-5017



답변

:+요소를 배열에 추가 하는 데 사용할 수 있습니다.+: 에 추가하고 앞에 .

0 +: array :+ 4

다음을 생성해야합니다.

res3: Array[Int] = Array(0, 1, 2, 3, 4)

의 다른 구현과 동일 Seq합니다.


답변

val array2 = array :+ 4
//Array(1, 2, 3, 4)

또한 “반전”작동 :

val array2 = 4 +: array
Array(4, 1, 2, 3)

“in-place”버전도 있습니다.

var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)


답변

가장 쉬운 방법은 다음과 같습니다.

Array(1, 2, 3) :+ 4

사실, Array는 WrappedArray


답변