2009-11-24 3 views
8

이것은 스타일과 환경 설정에 관한 더 많은 질문이지만, 여기서는 : 언제 scala를 사용해야합니까 ?Array? 나는 List를 항상 사용하고 때로는 Seq, Map 등을 실행하지만, Array를 야생에서 사용하거나 보지 못했습니다. 자바 호환성을위한 것일까 요? 일반적인 유즈 케이스가 누락 되었습니까?다른 컬렉션 대신 스칼라의 Array를 사용해야하는 경우는 언제입니까?

+0

커뮤니티 위키로 만들어야합니까? – pr1001

+1

나는 그렇게 생각하지 않는다. Scala의 Array를 사용하는 것에 대한 장단점은 꽤 잘 정의되어 있으며 객관적으로 논할 수 있습니다. 문제는 건전한 IMHO입니다. –

답변

12

우선 우선 여기에서 면책 조항을 작성해 보겠습니다. Scala 2.7의 Array은 동시에 Java Array과 Scala 컬렉션이 되려고합니다. 대부분 성공하지만 일부 경우에는 실패합니다. 불행히도, 이런 경우는 정상적인 코드를 가진 좋은 사람들에게 일어날 수 있습니다. 따라서 Scala 2.8은 그 일에서 벗어납니다.

스칼라 2.8에서 Array인데, 이는 Array입니다. 이는 참조 또는 프리미티브를 저장하는 (따라서 다른 요소 크기를 가질 수있는) 연속 메모리 공간을 의미하며 무작위로 빠르게 액세스 할 수 있습니다. 또한 끔찍한 방법, 끔찍한 toString 구현을 가지고 있으며, 동시에 generics와 primitives를 사용할 때 (예 : def f[T](a: Array[T]) = ...; f(Array(1,2,3))) 나쁘게 작동합니다.

그리고 나서 GenericArray이 있으며 이는 Array에 의해 뒷받침되는 스칼라 컬렉션입니다. 항상 박스형 프리미티브를 저장하기 때문에 프리미티브와 제네릭을 혼합 할 때 성능 문제는 없지만 다른 한편으로는 순수 프리미티브 (비 제네릭) 프리미티브 배열의 성능 향상은 없습니다.

그래서 언제 무엇을 사용합니까? Array은 다음과 같은 특징이 있습니다

  • O (1) 임의 읽기 및 쓰기를
  • O (n)이 APPEND/앞에 추가/삽입/삭제 그렇지 않으면
  • 변경할 수

제네릭이 필요하거나 제네릭이 [T <: AnyRef]으로 표시 될 수 있으며 따라서 AnyVal 인 프리미티브는 제외되며 이러한 특성은 코드에 가장 적합합니다.

프리미티브를 비롯하여 제네릭이 필요하고 코드에 이러한 특성이 가장 적합한 경우 ScalAnster 2.8에서 GenericArray을 사용하십시오. 또한 모든 메소드가 포함 된 진정한 Collection을 원한다면 암시 적 변환에 의존하는 대신 실제 Collection을 사용하는 것이 좋습니다.

불변성을 원하거나 추가, 추가, 삽입 또는 삭제에 대한 성능이 좋은 경우 다른 컬렉션을 찾으십시오.

+0

감사합니다. Daniel, 훌륭한 답변입니다. – pr1001

3

동일한 (또는 호환되는) 클래스의 항목이 여러 개 있고 해당 항목의 정확한 수 또는 합리적인 상한선을 알고 있고 빠른 임의성에 관심이있는 경우 배열이 적합합니다 액세스 및 아마도 장소에서의 항목 변경이 있지만 설정 한 후에는 목록의 어딘가에서 항목을 삽입하거나 제거 할 수 없습니다.

다른 방식으로 말하면, 콜렉션 유형보다 종소리와 호각이 적은 집계 데이터 구조입니다. 사용 방법에 따라 약간 오버 헤드가 있고 성능은 약간 향상됩니다.

매우 복잡한 예제 : 함수를 작성하는 비즈니스를 수행하고 있으며 이러한 함수의 품질 테스트에는 1000 개의 고정 입력 값 세트에 대한 성능 또는 결과를 확인하는 작업이 포함됩니다. 게다가이 값들을 파일에 저장하지 않고 프로그램에 하드 코딩하기로 결정했습니다. 배열이 적절할 것입니다.

3

Java API와의 인터페이스는 하나의 경우입니다. 또한 자바 배열과 달리 스칼라 배열은 불변하므로리스트 때문에 그다지 장점이 없습니다.

관련 문제