2016-06-23 3 views
2

저는 스칼라를 처음 사용합니다.스칼라 : 목록의 일부를 다른 목록에 복사하는 방법

나는 목록이 있습니다 origList = List [Double]은 수천 개의 요소가 있습니다. 다른리스트를 만들 필요가 있습니다. outList = List [Double] 인덱스를 가지고 origList의 요소를 복사합니다. start, start + 1, ..., start + nCopy-1 출력리스트에는 nCopy 집단.

이 코드 부분은 여러 번 실행됩니다. 스칼라에서 가장 효율적인 방법은 무엇입니까?

+1

당신은'슬라이스'를 찾고 있습니다. 'List'는 최상의 데이터 구조가 아닐 수도 있습니다. –

답변

3

사람들이 스칼라에서 일반적으로하는 방식은 list.slice(start, start+nCopy)입니다.

참고 스칼라에서 그 ListArrayList 같은 랜덤 액세스 컨테이너가 자바하지입니다. 이것은 연결된 목록으로 구현됩니다. 특히 여러 번이 작업을 수행하려는 경우 목록을 무언가로 변환하면 목록을 손으로 변환하면 큰 도움이됩니다 : val converted = list.toIndexedSeq 또는 더 좋은 경우는 val converted = list.toArray입니다.

또는 IndexedSeq이 훨씬 더 효율적이며, 특히 start 색인이 높은 경우 더욱 효율적입니다.

지금, 당신이 하나의 작업의 효율성에 대한 정말 우려, 아무것도없는 경우 (불행하게도) 좋은 된 자바 접근 방식을 친다 :

val converted = list.toArray 
val copied = java.util.Arrays.copyOfRange(converted, start, start+nCopy) 

이보다 빠른 크기의 주문 될 수있다(수십억) 개의 요소를 충분히 복사 할 때 (list.slice).

+0

'java.util.Arrays.copyOfRange'가'converted # slice'보다 "orders orders of magnitude faster"일 ​​수있는 이유를 기억해주십시오. 마지막으로'Array # copyOfRange'의 문서 (https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOfRange(T[],%20int,%20int))), 한 위험은 다음과 같다 :'원래 배열의 지정된 범위를 포함하는 새로운 배열. 필요한 길이를 얻기 위해 잘 리거나 패딩된다. ' –

+0

네이티브 코드를 사용하여 (매우) 다르게 구현되기 때문에 빠릅니다. 스칼라 구현과 같이 요소를 하나씩 이동하는 것보다는 한꺼번에 연속적인 메모리 덩어리를 복사하는 것이 좋습니다. 왜 "왜"그것이 "자바와 같은 방식으로 구현되지 않는가"를 의미한다면, 나는 잘 모른다. 스칼라 구현을 작성한 사람은 누구에게 물어 봐야합니다. 내 추측에 따르면 더 쉬웠다. "위험"부분에 대해서는 그 의미가 무엇인지 전혀 알지 못합니다. – Dima

+0

@Dima, 설명 주셔서 감사합니다. "위험"으로, 나는'java.util.Arrays.copyOfRange (Array (1,2,3), 0, 5)'==='Array (1, 2, 3, 0, 0)'만을 의미했다. 나의 순진한 가정은 위의 내용이'Array (1,2,3)'과 같았을 것인데, 즉'null'이 덧붙여지지 않았을 것이라는 것이었다. 나는 "문서를 읽는다"는 방법을 사용할 때 가정 된 작업이라고 생각하지만 순진하게, 덧붙여진 'null'을 기대하지는 않는다. –

관련 문제