두 세계의 장점을 모두 사용하지 않으시겠습니까? 다시 사용하지 않는 경우 TreeSet을 사용하여 정렬하고 내용으로 ArrayList를 초기화하십시오.
List<ComparableObject> sortedCollection =
new ArrayList<ComparableObject>(
new TreeSet<ComparableObject>(map.values()));
편집하다:
나는 세 가지 접근 방식 (ArrayList + Collections.sort, TreeSet 및 두 세계의 최선의 접근 방식)을 테스트하기 위해 벤치 마크를 만들었으며 ( pastebin.com/5pyPMJav 에서 액세스 할 수 있습니다 ) 내 것이 항상 승리합니다. 테스트 파일은 값이 의도적으로 끔찍한 비교기를 갖는 10000 개의 요소로 맵을 생성 한 다음 세 가지 전략 각각이 a) 데이터를 정렬하고 b) 반복 할 기회를 얻습니다. 다음은 샘플 출력입니다 (직접 테스트 할 수 있음).
편집 : Thingy.compareTo (Thingy)에 대한 호출을 기록하는 측면을 추가했으며 이전 솔루션 (적어도 정렬)보다 훨씬 빠른 PriorityQueues를 기반으로하는 새로운 전략도 추가했습니다.
compareTo() calls:123490
Transformer ArrayListTransformer
Creation: 255885873 ns (0.255885873 seconds)
Iteration: 2582591 ns (0.002582591 seconds)
Item count: 10000
compareTo() calls:121665
Transformer TreeSetTransformer
Creation: 199893004 ns (0.199893004 seconds)
Iteration: 4848242 ns (0.004848242 seconds)
Item count: 10000
compareTo() calls:121665
Transformer BestOfBothWorldsTransformer
Creation: 216952504 ns (0.216952504 seconds)
Iteration: 1604604 ns (0.001604604 seconds)
Item count: 10000
compareTo() calls:18819
Transformer PriorityQueueTransformer
Creation: 35119198 ns (0.035119198 seconds)
Iteration: 2803639 ns (0.002803639 seconds)
Item count: 10000
이상하게도 내 접근 방식은 반복에서 가장 잘 수행됩니다 (반복에서 ArrayList 접근 방식에 차이가 없다고 생각했을 것입니다. 벤치 마크에 버그가 있습니까?)
면책 조항 : 이것이 아마도 끔찍한 벤치 마크라는 것을 알고 있지만, 그것은 당신에게 요점을 전달하는 데 도움이되며 확실히 내 접근 방식을 이기기 위해 그것을 조작하지 않았습니다.
(코드는 equals / hashcode / compareTo 빌더에 대해 아파치 커먼즈 / lang에 종속되지만 리팩토링하기가 쉽습니다)