Apache Collections 라이브러리 TreeBidiMap
에서 사용 하고 있습니다. 이 값을 정렬하고 싶습니다 .doubles
내 방법은 다음을 Collection
사용하여 값 을 검색하는 것 입니다.
Collection coll = themap.values();
자연스럽게 잘 작동합니다.
주요 질문 : 이제 어떻게 정렬 / 변환 (정확한지 확실하지 않음) coll
을 List
정렬 할 수 있는지 알고 싶습니다 .
그런 다음 정렬 된 List
객체 를 반복하려고 합니다. 순서가 있어야하며 반복자가 목록 위에있는 위치를 사용하여 TreeBidiMap
( themap
) 에서 적절한 키를 가져옵니다 .themap.getKey(iterator.next())
doubles
답변
List list = new ArrayList(coll);
Collections.sort(list);
Erel Segal Halevi가 아래에 언급했듯이 coll이 이미 목록 인 경우 1 단계를 건너 뛸 수 있습니다. 그러나 그것은 TreeBidiMap의 내부에 달려 있습니다.
List list;
if (coll instanceof List)
list = (List)coll;
else
list = new ArrayList(coll);
답변
Collection이 필요한 ArrayList 생성자 를 호출하면 다음과 같이 작동합니다 .
List theList = new ArrayList(coll);
답변
coll이 이미 목록 인 경우 Paul Tomblin의 답변이 낭비 될 수 있습니다. 새로운 목록을 만들고 모든 요소를 복사하기 때문입니다. coll에 많은 elemeent가 포함되어 있으면 시간이 오래 걸릴 수 있습니다.
내 제안은 :
List list;
if (coll instanceof List)
list = (List)coll;
else
list = new ArrayList(coll);
Collections.sort(list);
답변
나는 당신이 그것을 다음과 같이 쓸 수 있다고 생각합니다.
coll.stream().collect(Collectors.toList())
답변
Collections.sort( new ArrayList( coll ) );
답변
@ 쿠니 가미 : 구아바의 newArrayList
방법 에 대해 착각 한 것 같습니다 . Iterable이 List 유형인지 확인하지 않고 주어진 목록을 그대로 리턴합니다. 그것은 항상 새 목록을 생성합니다 :
@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
checkNotNull(elements); // for GWT
// Let ArrayList's sizing logic work, if possible
return (elements instanceof Collection)
? new ArrayList<E>(Collections2.cast(elements))
: newArrayList(elements.iterator());
}
답변
요청한 작업은 비용이 많이 드는 작업이므로 자주 수행하지 않아도됩니다 (예 :주기).
그렇지 않으면 사용자 지정 컬렉션을 만들 수 있습니다. 나는 당신 TreeBidiMap
과 그 TreeMultiset
아래에있는 것을 생각해 냈습니다 . 필요한 것만 구현하고 데이터 무결성을 관리하십시오.
class MyCustomCollection implements Map<K, V> {
TreeBidiMap<K, V> map;
TreeMultiset<V> multiset;
public V put(K key, V value) {
removeValue(map.put(key, value));
multiset.add(value);
}
public boolean remove(K key) {
removeValue(map.remove(key));
}
/** removes value that was removed/replaced in map */
private removeValue(V value) {
if (value != null) {
multiset.remove(value);
}
}
public Set keySet() {
return map.keySet();
}
public Multiset values() {
return multiset;
}
// many more methods to be implemented, e.g. count, isEmpty etc.
}
이 방법으로, 당신은 정렬 된 Multiset
반환values()
. 그러나리스트가되어야한다면 (예를 들어, 배열과 같은 get(index)
방법 이 필요하다면 ) 좀 더 복잡한 것을 발명해야합니다.