質問

最近仕事中に、以下のようなコード(私が扱っているものと同じように再作成したもの)に遭遇しました。

(パフォーマンスを考慮して) 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);
    }


}
役に立ちましたか?

他のヒント

Apacheのコレクションは BidiMap インタフェース、かなり効果的な実装の様々な。

あなたは両方のマッピングを行うために、単一のMap<Object,Object>を使用することができます。必ず、醜いです。パフォーマンスはほぼ同じ、またはわずかに良いあなたは、いくつかのマップされた値を持つ多くのObjectMappersを持っている可能性は低いイベントである必要があります。

使用できます バイマップ から エクリプスコレクション.

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 コレクションのコミッターです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top