내 프로그램에서 ArrayBuffer를 사용하여 숫자 목록을 유지하려고합니다. 대기열로 사용하고 싶습니다. 매번 목록의 첫 번째 항목을 삭제하고 사용하십시오. 그런 다음 첫 번째 항목을 삭제할 때마다 큐에있는 다른 모든 숫자가 한 자리 이동하는 지 궁금합니다. 다음에 다시 항목 (0)을 읽을 수 있습니까?ArrayBuffer는 메모리에서 어떻게 작동합니까?
답변
는 스칼라 source code 또는 ArrayBuffer로 보면 remove
의 다음 구현 볼 수 있습니다 :
/** Removes the element on a given index position. It takes time linear in
* the buffer size.
*
* @param n the index which refers to the first element to delete.
* @param count the number of elements to delete
* @throws Predef.IndexOutOfBoundsException if `n` is out of bounds.
*/
override def remove(n: Int, count: Int) {
require(count >= 0, "removing negative number of elements")
if (n < 0 || n > size0 - count) throw new IndexOutOfBoundsException(n.toString)
copy(n + count, n, size0 - (n + count))
reduceToSize(size0 - count)
}
그래서 제거 된 요소가 더 이상 배열에 참여할 수 있으나, 실제로 제거 수단 모든 요소를 복사 (정의에서 "이동")하고, 더 긴 배열의 경우 속도가 느려집니다.
ArrayBuffer
은 기본적으로 Buffer
의 편리한 방법을 모두 구현하는 배열입니다.
설명대로 작동합니다. 요소를 제거하면 나머지 요소는 모두 "채우기"로 이동하고 문서에 명시된 것처럼 특히 첫 번째 요소를 제거하는 경우 다소 시간이 걸릴 수 있습니다.
추가, 업데이트 및 무작위 액세스에는 일정 시간 (상환 시간)이 소요됩니다. 앞부분과 뒤쪽은 버퍼 크기가 선형입니다.
따라서 ArrayBuffer
을 큐로 사용하지 않는 것이 좋습니다.
실제로 최상의 옵션은 질문입니다. Queue
을 사용하면됩니다. 그것은, 잘 ... 대기열로 설계되었습니다!
왜 대기열을 대기열로 사용하지 않습니까?Java Queue
그것은 좋은 방법은 설문 조사()라는 것이있다 (큐가 비어있는 경우 취득하고이 큐의 선두를 취득 해 삭제, 또는 null를 돌려줍니다.)
무엇을 그것 아닌가요 당신 필요한 것? 어레이 솔루션보다 성능이 좋습니다.
감사하지만 내 프로그램에서 arraybuffer를 사용하는 것이 더 확실하다는 일부 기능이 필요합니다. 내가 너희들에게 이야기하고 다른 방법을 시도했기 때문에 검색 알고리즘을 DFS로 변경하여 스택을 사용하기로 결정했다. 스칼라에서 그런 일이 발생 했는가 아니면 직접 구현해야 하는가? – Rubbic
(예 : 런타임 (캐시 위치) 또는 저장 (다음 포인터 없음) 효율성 이유로 인해) 배열 기반 데이터 구조를 사용하려는 경우 java.util.ArrayDeque
을 고려할 수 있습니다. 이 클래스는, 꽉 차있을 때 크기가 조정되는 원형 배열을 효과적으로 구현합니다. poll()
(검색하고 첫 번째 요소를 제거) 방법은 간단하게 시작을 증가시켜 구현은
사용하지 수 있도록 단점은,이 클래스가 java.util.Queue
인터페이스를 구현하더라도, scala.collection.mutable.Queue
에는 암시 적 변환이 없다는 것을,이다
map
과 같은 스칼라 컬렉션 메서드
참고 : 스칼라에는 2.11부터 Deque
인터페이스가없고 ArrayDeque
구현 만 남겨 둡니다.
- 1. openCPU에서 캐싱은 어떻게 작동합니까?
- 2. 메서드는 메모리에서 어떻게 참조됩니까?
- 3. 배열은 메모리에서 어떻게 처리됩니까?
- 4. 가상 상속은 어떻게 작동합니까?
- 5. JS가 객체 저장소를 메모리에서 어떻게 기능합니까?
- 6. 파이썬 변수가 메모리에서 어떻게 보이는지
- 7. 스칼라 변수는 메모리에서 어떻게 수행됩니까?
- 8. 파스칼 문자열은 메모리에서 어떻게 표현됩니까?
- 9. 일반 - 함수는 메모리에서 어떻게 표현됩니까?
- 10. linkWithCredential은 어떻게 작동합니까? 규칙은 어떻게 작동합니까?
- 11. #pragma align은 어떻게 작동합니까?
- 12. 어떻게 작동합니까?
- 13. 어떻게 작동합니까?
- 14. : 어떻게 작동합니까?
- 15. - 어떻게 작동합니까?
- 16. 어떻게 작동합니까?
- 17. 어떻게 작동합니까?
- 18. 매개 변수가있는 SqlCommand는 어떻게 작동합니까?
- 19. 정적 변수의 수명주기는 어떻게 작동합니까?
- 20. C 또는 C++ : 로더/래퍼는 어떻게 작동합니까?
- 21. Boehm GC는 C 프로그램에서 어떻게 작동합니까?
- 22. GC가 개체를 이동할 때 Object.GetHashCode는 어떻게 작동합니까?
- 23. SAX를 사용한 XML 스키마 검증 - 어떻게 작동합니까?
- 24. 파생 클래스 객체는 메모리에서 어떻게 보이나요?
- 25. 테스트 (메모리에서) 엔티티 프레임 워크를 어떻게 테스트합니까?
- 26. OS는 어떻게 가상 메모리에서 바이너리 파일을 실행합니까?
- 27. 선형 메모리에서 cudaTextureObject_t를 어떻게 만듭니 까?
- 28. 어떻게 자바에서 FireFox의 iframe으로 html을 메모리에서 동적으로로드합니까?
- 29. 공유 메모리에서 문자열 배열을 어떻게 분리합니까? C
- 30. C 구조체 멤버는 런타임시 메모리에서 어떻게 액세스됩니까?
이 외에도 Scala에는 [변경 가능] (http://www.scala-lang.org/api/current/index.html#scala.collection.mutable.Queue) 및 [변경 불능 대기열] (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Queue) implementation. –
@Ahalynd 감사합니다. 나는 그것을 위해 제거를 사용하고있다. 그러나 프로그램이 요소를 따는 것을 멈춘 이후로 아마 이유가 Arraybuffer 뒤에 있다고 생각했을 것이다. 이진 이미지에서 라인을 읽는 것은 연속적인 라인이지만 어느 시점에서는 멈 춥니 다! – Rubbic
@Rubbic은 여전히이 Array에 집착하여 큐로 사용하려는 이유를 이해하지 못합니다. Queue 's에 알레르기가 있습니까? 아니면 더 나은 동기가 있습니까? – Alboz