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


111

말 나는이 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


11
왜 사용하지 ArrayBuffer+=방법은? 그러면 상각 된 O (1)이 추가됩니다.
Fred Foo

1
스칼라에서 System.arraycopy(...)대체Array.copy(...)
패러다임 식

1
List vs Array의 장점과 단점을 알고 있지만 1,000 만 추가의 벤치 마크 결과에 놀랐습니까?
사용자 알 수없는

마지막 으로 배열에 추가 ArrayBuffer한 후 변환 된를 사용하여 벤치 마크를 다시 실행할 수 있습니까 (사용 )? toArray
패러다임의

@paradigmatic : 당연히 벤치 마크는 동일한 배열에 1,000 만 번 추가하는 것이 아니라 8 개 요소 배열에 단일 항목을 1,000 만 번 반복하는 것입니다. 그에 따라 질문을 업데이트했습니다.
Gregor Scheidt 2011 년

답변:


204

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

0 +: array :+ 4

다음을 생성해야합니다.

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

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


3
다른 스칼라 순서 컬렉션의 경우와 동일하며 , 예를 들어 set와 함께 작동하지 않습니다 (prepend 및 append가 Set에 대해 아무 의미가 없으므로).
Nicolas

@Nicolas 모든 시퀀스. 정렬 된 것을 의미 분류 .
Daniel C. Sobral 2011 년

@Daniel 예, 댓글을 썼을 때 작은 메모리 구멍이 있었는데 "시퀀스"라는 분명한 단어를 찾지 못했습니다
Nicolas

@tenshi이 모든 연산자가 새 배열을 만들까요? : 네, (+ 코드에서) 수행Array.copy(repr, 0, result, 0, repr.length)
Timofey

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

11
왜 Array 컬렉션이 ArrayBuffer처럼 append () 메서드를 사용하지 않는지 궁금합니다. 새로운 운영자는 내 의견으로는, 그것은 더 조정하고 사용하는 것보다의 Unify : + / + :
DJVU

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.