3

次のような 2 つの補完的なマップを含むコードがあります。

private final Map<Integer, String> idToName = new HashMap<Integer, String>();
private final Map<String, Integer> nameToID = new TreeMap<String, Integer>();

一方に何かを入れるときはいつでも、次のようにもう一方にも (キーと値を逆にして) 入れます。

nameToID.put(name, id);
idToName.put(id, name);

このアプリケーションでメモリの問題が発生しています。ここには多くの重複があるようです。これをよりメモリ効率的にする方法はありますか? 使用できる単一の構造はありますか? これは時間効率を犠牲にする可能性があることを認識しているので、トレードオフがどうなるかに興味があります。

4

3 に答える 3

5

これはまさにGuava BiMapが行うことですが、得られる追加のメモリ効率はそれほど多くありません。の最大の利点はBiMap、「値が一意であることを保証し、逆マップの更新を忘れることができない」ほどのメモリ効率ではありません。

BiMap<Integer, String> idToName = HashBiMap.create();
idToName.put(1, "foo");
idToName.inverse(); // returns a BiMap mapping "foo" to 1
idToName.inverse().put("bar", 2); // idToName now has an extra mapping 2 -> "bar"

(開示:私はGuavaに貢献しています。)

于 2012-10-05T18:35:19.803 に答える
0

Google Guava (docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html) の BiMap クラスの使用を検討できますが、メモリが増えるかどうかはわかりません。効率的。

private final Map<Integer, String> idToName = new BiMap<Integer, String>();
private final Map<String, Integer> nameToID = idToName.inverse();

idToNameそして、マップに追加するだけです:

idToName.put(name, id);
于 2012-10-05T18:37:55.170 に答える
0

Apache commons BidiMapを使用することもできます。

BidiMap はinverseBidiMap()、キーと値が逆になっているこのマップのビューを取得するメソッドを公開します。

それが役立つことを願っています!

于 2012-10-05T18:38:28.150 に答える