이것은 스타일과 환경 설정에 관한 더 많은 질문이지만, 여기서는 : 언제 scala를 사용해야합니까 ?Array? 나는 List를 항상 사용하고 때로는 Seq, Map 등을 실행하지만, Array를 야생에서 사용하거나 보지 못했습니다. 자바 호환성을위한 것일까 요? 일반적인 유즈 케이스가 누락 되었습니까?다른 컬렉션 대신 스칼라의 Array를 사용해야하는 경우는 언제입니까?
답변
우선 우선 여기에서 면책 조항을 작성해 보겠습니다. 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을 사용하는 것이 좋습니다.
불변성을 원하거나 추가, 추가, 삽입 또는 삭제에 대한 성능이 좋은 경우 다른 컬렉션을 찾으십시오.
감사합니다. Daniel, 훌륭한 답변입니다. – pr1001
동일한 (또는 호환되는) 클래스의 항목이 여러 개 있고 해당 항목의 정확한 수 또는 합리적인 상한선을 알고 있고 빠른 임의성에 관심이있는 경우 배열이 적합합니다 액세스 및 아마도 장소에서의 항목 변경이 있지만 설정 한 후에는 목록의 어딘가에서 항목을 삽입하거나 제거 할 수 없습니다.
다른 방식으로 말하면, 콜렉션 유형보다 종소리와 호각이 적은 집계 데이터 구조입니다. 사용 방법에 따라 약간 오버 헤드가 있고 성능은 약간 향상됩니다.
매우 복잡한 예제 : 함수를 작성하는 비즈니스를 수행하고 있으며 이러한 함수의 품질 테스트에는 1000 개의 고정 입력 값 세트에 대한 성능 또는 결과를 확인하는 작업이 포함됩니다. 게다가이 값들을 파일에 저장하지 않고 프로그램에 하드 코딩하기로 결정했습니다. 배열이 적절할 것입니다.
Java API와의 인터페이스는 하나의 경우입니다. 또한 자바 배열과 달리 스칼라 배열은 불변하므로리스트 때문에 그다지 장점이 없습니다.
- 1. For 루프 대신 Map을 사용해야하는 경우는 언제입니까?
- 2. 십진수 대신 double을 사용해야하는 경우는 언제입니까?
- 3. PriorityQueue보다 TreeMap을 사용해야하는 경우는 언제입니까?
- 4. 강력한 형식의보기를 사용해야하는 경우는 언제입니까?
- 5. 스칼라의 메서드에 반환 형식이 필요한 경우는 언제입니까?
- 6. 직접 던지는 대신 ThrowHelper 메서드를 사용해야하는 경우는 언제입니까?
- 7. WXPython을 사용하여 클래스를 사용해야하는 경우는 언제입니까?
- 8. 복합 형을 반환하는 대신 'out` 매개 변수를 사용해야하는 경우는 언제입니까?
- 9. MySQL에서 복수 OR 연산자 대신 IN 연산자를 사용해야하는 경우는 언제입니까?
- 10. 그래픽에서 dispose()를 사용해야하는 경우는 언제입니까?
- 11. Windows 스레드 : InterlockedExchangeAdd()를 사용해야하는 경우는 언제입니까?
- 12. 상속 대신 위임을 사용하는 경우는 언제입니까?
- 13. iPhone SDK에서 @property 및 @synthesize를 사용해야하는 경우는 언제입니까?
- 14. IEnumerable <T>을 통해 IEnumerable을 사용해야하는 경우는 언제입니까?
- 15. if() 대신 #ifdef를 사용해야하는 경우는 언제입니까? 목표 - C에서 작업 할 때
- 16. Assembly.CodeBase : 파일 URI가없는 경우는 언제입니까?
- 17. ivars를 포인터로 정의하는 경우는 언제입니까?
- 18. web.config가 너무 큰 경우는 언제입니까?
- 19. AtomicBoolean 대신 Java에서 volatile 휘발성을 사용하는 것이 바람직한 경우는 언제입니까?
- 20. PHP에서 변수 변수를 사용하는 경우는 언제입니까?
- 21. 쿼리가 너무 큰 경우는 언제입니까?
- 22. 키 - 값 데이터 저장소와 전통적인 관계형 데이터베이스를 사용해야하는 경우는?
- 23. webclient 또는 httpwebrequest보다 WCF를 사용하는 것이 적절한 경우는 언제입니까?
- 24. while 루프에서 for 루프를 사용하는 경우는 언제입니까?
- 25. node.js에서 TCP와 HTTP를 사용하는 경우는 언제입니까?
- 26. Entity Framework 4에서 ApplyOriginalValues를 사용하는 경우는 언제입니까?
- 27. couchDB를 사용하는 것이 적절한 경우는 언제입니까?
- 28. WPF 바인딩에서 경로를 사용하는 경우는 언제입니까?
- 29. 속성 대 메소드를 사용하는 경우는 언제입니까?
- 30. Objective-C에서 포인터가 사용되지 않는 경우는 언제입니까?
커뮤니티 위키로 만들어야합니까? – pr1001
나는 그렇게 생각하지 않는다. Scala의 Array를 사용하는 것에 대한 장단점은 꽤 잘 정의되어 있으며 객관적으로 논할 수 있습니다. 문제는 건전한 IMHO입니다. –