[java] Java에서 Ordered Set 구현이 있습니까?

Objective-C에 익숙한 사람이 있으면 SetNSOrderedSet 역할을 하는 컬렉션이 있으며 해당 항목은 Array 의 항목으로 액세스 할 수 있습니다 .

Java에 이와 같은 것이 있습니까?

라는 컬렉션이 있다고 들었지만 LinkedHashMap세트에 대해 이와 비슷한 것을 찾지 못했습니다.



답변

LinkedHashSet 클래스 살펴보기

Java 문서에서 :

예측 가능한 반복 순서 와 함께 Set 인터페이스의 해시 테이블 및 연결 목록 구현 . 이 구현은 모든 항목을 통해 실행되는 이중 연결 목록을 유지한다는 점에서 HashSet과 다릅니다. 이 연결 목록은 요소가 집합에 삽입 된 순서 인 반복 순서를 정의합니다 (insertion-order) . 요소가 세트에 다시 삽입되는 경우 게재 순서는 영향을받지 않습니다 . (s.contains (e)가 호출 직전에 true를 반환 할 때 s.add (e)가 호출되면 요소 e가 집합 s에 다시 삽입됩니다.)


답변

모든 Set에는 iterator ()가 있습니다. 일반적인 HashSet의 반복자는 매우 무작위 적이며 TreeSet은 정렬 순서로 수행하고 LinkedHashSet 반복자는 삽입 순서로 반복합니다.

그러나 LinkedHashSet의 요소를 바꿀 수는 없습니다. 하나를 제거하고 다른 요소를 추가 할 수 있지만 새 요소는 원본 위치에 있지 않습니다. LinkedHashMap에서 기존 키의 값을 바꿀 수 있으며 값은 원래 순서대로 유지됩니다.

또한 특정 위치에 삽입 할 수 없습니다.

중복 삽입을 피하기 위해 명시 적 검사와 함께 ArrayList를 사용하는 것이 좋습니다.


답변

Java 표준 API 문서를 살펴보십시오 . 바로 옆에 LinkedHashMap하는있다 LinkedHashSet. 그러나 그 순서는 요소의 자연스러운 순서가 아니라 삽입 순서입니다. 그리고 무작위 액세스를 수행하지 않고 해당 순서로만 반복 할 수 있습니다 (반복 단계 계산 제외).

및에 SortedSet의해 구현 된 인터페이스도 있습니다 . 둘 다 요소 또는 a 의 자연스러운 순서 로 반복을 허용 하지만 임의 액세스 또는 삽입 순서는 허용하지 않습니다.TreeSetConcurrentSkipListSetComparator

인덱스로 효율적으로 액세스 할 수 있고 설정된 기준을 효율적으로 구현할 수있는 데이터 구조의 경우 건너 뛰기 목록이 필요 하지만 Java Standard API에는 해당 기능이 구현되어 있지 않지만 쉽게 찾을 수 있습니다. 인터넷에서.


답변


답변

java.util.TreeSet그 구현을 사용해보십시오 SortedSet.

문서를 인용하려면 :

“요소는 자연 순서를 사용하거나 사용되는 생성자에 따라 설정된 생성 시간에 제공된 비교기를 사용하여 정렬됩니다.”

추가, 제거 및 포함에는 시간 비용 log (n)가 있습니다.

집합의 내용에 배열로 액세스하려면 다음을 수행하여 변환 할 수 있습니다.

YourType[] array = someSet.toArray(new YourType[yourSet.size()]); 

이 배열은 TreeSet과 동일한 기준 (자연 또는 비교기)으로 정렬되며, 많은 경우 Arrays.sort ()를 수행하는 대신 이점이 있습니다.


답변

treeset 은 정렬 된 집합이지만 항목 인덱스를 통해 액세스 할 수 없으며 반복하거나 시작 / 끝으로 이동합니다.


답변

생략 목록의 저렴한 구현에 대해 이야기하고 있다면 빅 O의 관점에서이 작업의 비용이 얼마인지 궁금합니다.

YourType [] array = someSet.toArray (new YourType [yourSet.size ()]);

내 말은 항상 전체 배열 생성에 갇혀 있으므로 O (n)입니다.

java.util.Arrays#copyOf