자바 세트 주문 유지?
Java 세트가 주문을 유지합니까? 메서드가 Set을 반환하고 데이터가 정렬되었지만 Set을 반복하면 데이터가 정렬되지 않습니다. 이것을 관리하는 더 좋은 방법이 있습니까? Set 이외의 것을 반환하기 위해 메소드를 변경해야합니까?
Set
인터페이스는 어떤 순서 보증을 제공하지 않습니다.
하위 인터페이스 SortedSet
는 일부 기준에 따라 정렬 된 세트를 나타냅니다. Java 6에는 구현하는 두 개의 표준 컨테이너가 있습니다 SortedSet
. 그들은이다 TreeSet
와 ConcurrentSkipListSet
.
SortedSet
인터페이스 외에도 LinkedHashSet
클래스도 있습니다. 요소가 세트에 삽입 된 순서를 기억하고 해당 순서대로 요소를 리턴합니다.
LinkedHashSet 이 필요합니다.
많은 회원들이 제안한 것처럼 LinkedHashSet 을 사용 하여 컬렉션의 순서를 유지합니다. U는이 구현을 사용하여 세트를 포장 할 수 있습니다.
SortedSet 구현은 정렬 순서에 사용할 수 있지만 목적에 따라 LinkedHashSet을 사용하십시오 .
또한 문서에서
"이 구현은 TreeSet과 관련된 비용 증가없이 HashSet에서 제공하는 지정되지 않은 일반적으로 혼란스러운 순서에서 클라이언트를 보호합니다. 원본과 상관없이 원본과 동일한 순서의 세트 사본을 생성하는 데 사용할 수 있습니다. 세트의 구현 : "
출처 : http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
세트는 단지 인터페이스입니다. 순서를 유지하려면 해당 인터페이스와 하위 인터페이스 SortedSet의 특정 구현 (예 : TreeSet 또는 LinkedHashSet)을 사용해야합니다. 다음과 같이 세트를 감쌀 수 있습니다.
Set myOrderedSet = new LinkedHashSet(mySet);
주문 사용을 유지하려면 List
또는 LinkedHashSet
.
다음은 Set
Java에서 사용 가능한 표준 구현 의 순서 특성에 대한 간략한 요약입니다 .
- 삽입 순서 유지 : LinkedHashSet 및 CopyOnWriteArraySet (스레드 안전)
- 항목을 TreeSet , EnumSet (enum에만 해당) 및 ConcurrentSkipListSet (스레드 안전) 세트로 정렬 유지
- 특정 순서로 항목을 유지하지 않습니다 : HashSet (시도한 것)
특정한 경우에는 먼저 항목을 정렬 한 다음 1 또는 2 (대부분은 LinkedHashSet
또는 TreeSet
)를 사용할 수 있습니다. 또는 더 효율적으로 또는 더 효율적으로 정렬되지 않은 데이터를 추가 TreeSet
하여 자동으로 정렬을 처리 할 수 있습니다.
LinkedHashSet은 모든 요소에서 이중 연결 List를 유지 관리하는 HashSet의 정렬 버전입니다. 반복 순서를 염려 할 때 HashSet 대신이 클래스를 사용하십시오.
에 대한 javadoc에서 Set.iterator()
:
이 세트의 요소에 대한 반복자를 리턴합니다. 요소는 특정 순서로 리턴되지 않습니다 (이 세트가 보증을 제공하는 일부 클래스의 인스턴스가 아닌 한).
그리고 shuuchan이 이미 언급했듯이 a TreeSet
는 Set
보장 순서를 구현합니다 .
요소는 사용 된 생성자에 따라 고유 한 순서를 사용하거나 설정된 생성 시간에 제공된 비교기로 정렬됩니다.
일반적으로 set은 emelent를 빨리 찾기 위해 HashSet과 같은 순서를 유지하지 않지만 LinkedHashSet을 시도하면 넣은 순서를 유지합니다.
Set 인터페이스 자체는 특정 순서를 규정하지 않습니다. 그러나 SortedSet 은 수행합니다.
Set에 의해 리턴 된 반복자는 순서대로 데이터를 리턴한다고 가정하지 않습니다. 동일한 콜렉션에 대한 두 개의 java.util.Iterators를 참조하십시오 . 동일한 순서로 요소를 리턴해야합니까?
두 가지가 있습니다.
- 세트의 요소를 정렬하십시오. 이를 위해 SortedSet 및 simillar 구현이 있습니다.
- 삽입 순서를 세트로 유지하십시오. LinkedHashSet 및 CopyOnWriteArraySet (스레드 안전)을 사용할 수 있습니다.
SortedSet
의 주문 만 할 수 있습니다Set
참고 URL : https://stackoverflow.com/questions/10752753/java-set-retain-order
'development' 카테고리의 다른 글
두 개의 SELECT 문 결과에 참여 (0) | 2020.06.09 |
---|---|
링크가없는 JavaScript Blob 파일 이름 (0) | 2020.06.09 |
SQL Server 2008을 사용하여 여러 CASE WHEN 조건을 어떻게 수행합니까? (0) | 2020.06.09 |
Github“원격에없는 작업이 포함되어 있기 때문에 업데이트가 거부되었습니다” (0) | 2020.06.09 |
DialogFragment에서 조각으로 콜백 (0) | 2020.06.09 |