質問
最近仕事中に、以下のようなコード(私が扱っているものと同じように再作成したもの)に遭遇しました。
(パフォーマンスを考慮して) 1 つのデータ構造を使用するように以下のコードを修正する方法はありますか?
ここで私が言いたいことを説明するためのコードをいくつか示します。
public class ObjectMapper {
private Map<UUID,Integer> uuidMap;
private Map<Integer,UUID> indexMap;
public ObjectMapper(){
uuidMap = new HashMap<UUID,Integer>();
indexMap = new HashMap<Integer,UUID>();
}
public void addMapping(int index, UUID uuid){
uuidMap.put(uuid, index);
indexMap.put(index, uuid);
}
.
.
.
public Integer getIndexByUUID(UUID uuid){
return uuidMap.get(uuid);
}
public UUID getUUIDByIndex(Integer index){
return indexMap.get(index);
}
}
解決
この答えているのはここから2領域マップを使用することを推奨してを Googleのコレクションの
他のヒント
Apacheのコレクションは BidiMap >インタフェース、かなり効果的な実装の様々な。
あなたは両方のマッピングを行うために、単一のMap<Object,Object>
を使用することができます。必ず、醜いです。パフォーマンスはほぼ同じ、またはわずかに良いあなたは、いくつかのマップされた値を持つ多くのObjectMapper
sを持っている可能性は低いイベントである必要があります。
使用できます バイマップ から エクリプスコレクション.
BiMap
は、ユーザーが両方向から検索を実行できるマップです。BiMap 内のキーと値はどちらも一意です。
主な実装は次のとおりです HashBiMap
.
inverse()
BiMap.inverse()
キーの型と値の型の位置が入れ替わったビューを返します。
MutableBiMap<Integer, String> biMap =
HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));
put()
MutableBiMap.put()
のように振る舞う Map.put()
通常のマップでは、重複した値が追加されたときにスローされます。
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException
forcePut()
これは次のように動作します MutableBiMap.put()
, ただし、キーと値のペアをマップに追加する前に、同じ値を持つマップ エントリがサイレントに削除されます。
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.forcePut(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.put(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "1"), biMap);
注記: 私は Eclipse コレクションのコミッターです。