Scala : 배열에 요소를 추가하는 가장 좋은 방법은 무엇입니까?
말 나는이 Array[Int]
같은
val array = Array( 1, 2, 3 )
이제 4
다음 예제와 같이 값을 배열에 추가하고 싶습니다 .
val array2 = array + 4 // will not compile
물론 System.arraycopy()
이 작업을 직접 사용 하고 수행 할 수 있지만이를위한 Scala 라이브러리 함수가 있어야합니다. 모든 조언에 감사드립니다!
노트:
다음 줄과 같이 요소의 다른 배열을 추가 할 수 있지만 너무 둥글게 보입니다.
val array2b = array ++ Array( 4 ) // this works
나는 List vs Array의 장점과 단점을 알고 있으며 여기에는 Array 확장에 특별히 관심이있는 다양한 이유가 있습니다.
편집 1
:+
운영자 방법을 가리키는 답변에 감사드립니다 . 이것이 제가 찾던 것입니다. 안타깝게도 사용자 지정 append () 메서드 구현 arraycopy
보다 속도가 느립니다. 약 2 ~ 3 배 느립니다. 에서 구현을 보면 SeqLike[]
빌더가 생성되고 배열이 추가 된 다음 빌더를 통해 추가가 완료된 다음 빌더가 렌더링됩니다. 배열에 대한 좋은 구현이 아닙니다. 두 가지 방법을 비교하는 빠른 벤치 마크를 수행하여 10주기 중 가장 빠른 시간을 확인했습니다. 어떤 클래스의 8 개 요소 배열 인스턴스에 단일 항목 추가를 1,000 만 번 반복하면 다음 을 사용 하는 간단한 방법으로 Foo
3.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)
.NET Framework의 다른 구현과 동일 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
'programing tip' 카테고리의 다른 글
불변 클래스는 어떻게 만듭니 까? (0) | 2020.08.10 |
---|---|
Func 란 무엇이며 언제 어떻게 사용합니까? (0) | 2020.08.09 |
부모 컨테이너와 관련된 요소의 위치 / 오프셋을 얻습니까? (0) | 2020.08.09 |
model.save ()에서 성공 콜백을 어떻게 트리거합니까? (0) | 2020.08.09 |
Emacs에서 Linux의 다른 응용 프로그램으로 텍스트를 복사하는 방법 (0) | 2020.08.09 |