이에 대한 빠른 답변을 찾을 수 없어서 당황 스럽습니다. 기본적으로 java.util.List
인터페이스 를 구현 하지만 구성원을 정렬 된 순서로 저장 하는 Java의 데이터 구조를 찾고 있습니다. 노멀 ArrayList
을 사용 Collections.sort()
하여 사용할 수 있다는 것을 알고 있지만 가끔 내 목록에서 회원을 추가하고 자주 검색하는 시나리오가 있습니다. 새로운 것이 추가되었습니다. 누구든지 JDK 또는 타사 라이브러리에 존재하는 그런 것을 가리킬 수 있습니까?
편집 : 데이터 구조는 중복을 보존해야합니다.
답변 요약 :이 모든 것이 매우 흥미롭고 많은 것을 배웠습니다. 특히 Aioobe는 위의 요구 사항 (주로 중복을 지원하는 정렬 된 java.util.List 구현)을 달성하려는 노력에 대해 언급 할 가치가 있습니다. 나는 그의 대답을 내가 요청한 것에 대해 가장 정확한 것으로 받아 들였고, 내가 요청한 것이 정확히 내가 필요로하는 것이 아니더라도 내가 찾고있는 것의 의미를 자극한다고 생각했다.
내가 요청한 문제는 List 인터페이스 자체와 인터페이스의 선택적 메서드 개념에 있습니다. javadoc을 인용하려면 :
이 인터페이스의 사용자는 목록에서 각 요소가 삽입되는 위치를 정확하게 제어 할 수 있습니다.
정렬 된 목록에 삽입하면 삽입 지점을 정확하게 제어 할 수 없습니다. 그런 다음 몇 가지 방법을 어떻게 처리할지 생각해야합니다. 가지고 add
예를 들면 :
public boolean add (Object o)
Appends the specified element to the end of this list (optional operation).
이제 계약을 파기하고 추가 2의 정렬 된 버전을 구현) 분들께) 중 하나의 불편한 상황에서 남아있는 add
당신의 정렬 된 순서 3) 떠나 파괴, 목록의 마지막에 요소를 추가 add
던지는하여 선택적으로 (아웃) UnsupportedOperationException
및 정렬 된 순서로 항목을 추가하는 다른 방법을 구현.
옵션 3이 아마도 최고 일 것입니다.하지만 사용할 수없는 add 메서드와 인터페이스에없는 다른 sortedAdd 메서드가있는 것은 좋지 않습니다.
기타 관련 솔루션 (특정 순서 없음) :
- 내가 요청한 것보다 필요한 것에 가장 가까운 java.util.PriorityQueue . 큐는 제 경우에 개체 컬렉션의 가장 정확한 정의는 아니지만 기능적으로 필요한 모든 것을 수행합니다.
- net.sourceforge.nite.util.SortedList . 그러나이 구현은
add(Object obj)
메서드 에서 정렬을 구현하여 List 인터페이스의 계약을 깨뜨리고add(int index, Object obj)
. 일반적인 합의에 따르면throw new UnsupportedOperationException()
이 시나리오에서는 더 나은 선택이 될 수 있습니다. - Guava의 TreeMultiSet 중복을 지원하는 집합 구현
- ca.odell.glazedlists.SortedList 이 클래스는 javadoc에주의 사항이 있습니다.
Warning: This class breaks the contract required by List