4

値Comparatorを使用して、アイテムをHashMap、TreeMap、またはSortedMap(他のAPIを提案する場合があります)に挿入したいと思います。

私はこれを含む多くの投稿を読みまし。ほとんどの投稿は、すべてのアイテムが挿入された後、値Comparatorを使用してHashMapをSortedMapに再挿入することを提案しています。

すべての値を再度挿入することに興味はありません。各挿入後の値コンパレータのアクティブ化をサポートするオプションまたはマップ類似データ構造はありませんか?

重複する問題がある場合は、リンクをいただければ幸いです(一部を見逃した可能性がありますが、検索を行いました)

繰り返しになりますが、ある種の順序付けされたマップに値を追加して、すべてのアイテムが1回の挿入ごとにキーではなく値で順序付けられるようにすることに興味があります。

Mapエントリの値は、実際にはいくつかのゲッターを含む複雑なオブジェクトであり、値オブジェクトの特定のゲッターのみで並べ替えたいと思います。

4

4 に答える 4

3

必要なのはorg.apache.commons.collections.bidimap.TreeBidiMap

追加されたすべてのオブジェクトがComparableインターフェイスを実装するBidiMapの赤黒木ベースの実装。

このクラスは、マップがキーの昇順と値の昇順の両方であり、キーと値のクラスの自然な順序に従ってソートされることを保証します。

于 2012-10-28T13:05:34.720 に答える
3

私はいくつかの回避策を持っていますが、それは完璧ではなく、もう少しメモリを使用しますが、それはかなり単純です。

Mapのキーを拡張して、Valueオブジェクトのゲッターから返された値も保持することができます。次に、キーComparatorを拡張して、キーの正しいタプルで並べ替えます。

アップデート

非常に良いパフォーマンスでチャームとして働いた。

于 2012-10-28T13:14:24.497 に答える
2

マップとは、キーから値への移行に関するものです。Guavaには双方向マッピングの概念がありますが、値からキーに移動することは実際には気にせず、値の並べ替えられた反復を公開します。私がお勧めするのは、HashMapとPriorityQueueの両方を格納するカスタムコンテナです。

したがって、Map、Collection、およびIterableインターフェースを拡張し、追加時にHashMapとPriorityQueueの両方に挿入します。反復するときは、キューを反復処理し、検索/取得するときにマップに移動します。

于 2012-10-28T12:54:06.720 に答える
1

私は似たようなものを探していましたがTreeBidiMap、Comparableインターフェイスを実装するためにマップのキーが必要なため、使用できませんでした。

だから私は自分のミニマリズムを書きましたValueTreeMap

import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;

public class ValueTreeMap<K, V extends Comparable<V>> implements Iterable<V> {
    private TreeSet<V> tree = new TreeSet<V>();
    private HashMap<K, V> map = new HashMap<K, V>();

    public void put(K key, V value){
        V oldValue = map.get(key);
        if(oldValue != null){
            tree.remove(oldValue);
        }
        tree.add(value);
        map.put(key, value);
    }

    public V get(K key){
        return map.get(key);
    }

    @Override
    public Iterator<V> iterator() {
        return tree.iterator();
    }

}
于 2016-12-06T01:44:50.537 に答える