[java] 자바 세트 주문 유지?

Java 세트가 주문을 유지합니까? 메소드가 Set을 나에게 반환하고 데이터가 정렬되었지만 Set을 반복하면 데이터가 정렬되지 않습니다. 이것을 관리하는 더 좋은 방법이 있습니까? Set 이외의 것을 반환하기 위해 메소드를 변경해야합니까?



답변

Set인터페이스는 어떤 순서 보증을 제공하지 않습니다.

하위 인터페이스 SortedSet는 일부 기준에 따라 정렬 된 세트를 나타냅니다. Java 6에는 구현하는 두 개의 표준 컨테이너가 있습니다 SortedSet. 그들은이다 TreeSetConcurrentSkipListSet.

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);


답변

다음은 SetJava에서 사용 가능한 표준 구현 의 순서 특성에 대한 간략한 요약입니다 .

  1. 삽입 순서 유지 : LinkedHashSetCopyOnWriteArraySet (스레드 안전)
  2. 항목을 TreeSet , EnumSet (enum에만 해당) 및 ConcurrentSkipListSet (스레드 안전) 세트로 정렬 유지
  3. 특정 순서로 항목을 유지하지 않습니다 : HashSet (시도한 것)

특정한 경우에는 먼저 항목을 정렬 한 다음 1 또는 2 (대부분은 LinkedHashSet또는 TreeSet)를 사용할 수 있습니다. 또는 더 효율적으로 또는 더 효율적으로 정렬되지 않은 데이터를 추가 TreeSet하여 자동으로 정렬을 처리 할 수 ​​있습니다.


답변

주문 사용을 유지하려면 List또는 LinkedHashSet.


답변

LinkedHashSet은 모든 요소에서 이중 연결 List를 유지 관리하는 HashSet의 정렬 버전입니다. 반복 순서를 염려 할 때 HashSet 대신이 클래스를 사용하십시오.