[java] 컬렉션을 목록으로 변환하는 방법?

Apache Collections 라이브러리 TreeBidiMap에서 사용 하고 있습니다. 이 값을 정렬하고 싶습니다 .doubles

내 방법은 다음을 Collection사용하여 값 을 검색하는 것 입니다.

Collection coll = themap.values();

자연스럽게 잘 작동합니다.

주요 질문 : 이제 어떻게 정렬 / 변환 (정확한지 확실하지 않음) collList정렬 할 수 있는지 알고 싶습니다 .

그런 다음 정렬 된 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)방법 이 필요하다면 ) 좀 더 복잡한 것을 발명해야합니다.