328

私はApache CollectionsライブラリTreeBidiMapから使用しています。の値でこれを並べ替えたいです。doubles

Collection私の方法は、次を使用して値を 取得することです。

Collection coll = themap.values();

これは自然にうまく機能します。

主な質問:どのように変換/キャストできるか (どちらが正しいかはわかりません) を知りたいcollのでList、並べ替えることができますか?

次に、並べ替えられたオブジェクトを反復処理して、 ( )Listから適切なキーを取得します。イテレータは のリスト上にある場所を使用します。TreeBidiMapthemapthemap.getKey(iterator.next())doubles

4

11 に答える 11

503
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);
于 2009-02-24T02:02:14.457 に答える
106

Collection を取るArrayList コンストラクターを呼び出すと、次のように動作するはずです。

List theList = new ArrayList(coll);
于 2009-02-24T02:03:09.960 に答える
33

新しいリストを作成してすべての要素をコピーするため、collがすでにリストである場合、Paul Tomblinの答えは無駄かもしれません。coll に多くの要素が含まれている場合、これには長い時間がかかる場合があります。

私の提案は次のとおりです。

List list;
if (coll instanceof List)
  list = (List)coll;
else
  list = new ArrayList(coll);
Collections.sort(list);
于 2011-07-24T10:25:41.633 に答える
10
Collections.sort( new ArrayList( coll ) );
于 2009-02-24T02:06:40.327 に答える
4

newArrayList@Kunigami: Guava の方法を誤解していると思います。Iterable が List 型であるかどうかはチェックせず、指定された 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());
}
于 2014-01-08T21:39:10.523 に答える
1

あなたが要求したことは、非常にコストのかかる操作です。頻繁に (たとえば、サイクルで) 実行する必要がないことを確認してください。

並べ替えを維持する必要があり、頻繁に更新する場合は、カスタム コレクションを作成できます。たとえば、ボンネットの下にTreeBidiMapandがあるものを思いつきました。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<K> keySet() {
        return Collections.unmodifiableSet(map.keySet());
    }
    public Collection<V> values() {
        return Collections.unmodifiableCollection(multiset);
    }
    // many more methods to be implemented, e.g. count, isEmpty etc.
    // but these are fairly simple
}

このようにして、からソートされ Multisetたが返されvalues()ます。ただし、リストにする必要がある場合 (たとえば、配列のようなget(index)メソッドが必要な場合) は、もっと複雑なものが必要になります。

簡潔にするために、変更不可能なコレクションのみを返します。@Lino が言及したことは正しく、keySetorvaluesコレクションをそのまま変更すると一貫性がなくなります。values変更可能にする一貫した方法はわかりませんが、上記のクラスのメソッドを使用する場合keySetはサポートできます。removeremoveMyCustomCollection

于 2015-05-28T15:43:24.147 に答える
0

ストリームを使用:

someCollection.stream().collect(Collectors.toList())
于 2020-09-16T21:23:47.440 に答える
-4

これは、ワンライナーとして最適ではないソリューションです。

Collections.list(Collections.enumeration(coll));
于 2014-07-29T14:57:14.400 に答える