簡體   English   中英

Java中的雙向集合

[英]Two way collections in Java

我有一個對象列表。 給對象一個ID並存儲在Hashtable中。 如果我需要一個具有特定ID的對象,我只想說:

ht.get(ID);

但是,有時我需要獲取給定對象的ID:

ht.get(Object);

我的第一個想法是使用兩個不同的HashTables; 一個用於ID - >對象映射,另一個用於對象 - > ID映射。

這聽起來像是一個足夠好的解決方案嗎?

如果你不能使用外部集合(因為你似乎不想使用你的評論之一),你可以編寫一個簡單的類來做你想要的(這是,基本上是你的第一個想法),沿着(I沒有編譯這個,這只是第一個想法所以可能是一個壞主意等...):

編輯:現在有兩個版本,一個允許重復值,另一個不允許。 如果值被覆蓋,那些不會刪除密鑰。

此版本不允許重復值:

class Foo<K, V>
{
    private final Map<K, V> keyValue;
    private final Map<V, K> valueKey;

    {
        keyValue = new HashMap<K, V>();
        valueKey = new HashMap<V, K>();
    }

    // this makes sure that if you do not have duplicate values.
    public void put(final K key, final V value)
    {
        if(keyValue.containsValue(value))
        {
            keyValue.remove(valueKey.get(value));
        }

        keyValue.put(key, value);
        valueKey.put(value, key);
    }

    public V getValueForKey(final K key)
    {
        return (keyValue.get(key));
    }

    public K getKeyForValue(final V value)
    {
        return (valueKey.get(value));
    }

    public static void main(final String[] argv)
    {
        Foo<String, String> foo;

        foo = new Foo<String, String>();
        foo.put("a", "Hello");
        foo.put("b", "World");
        foo.put("c", "Hello");

        System.out.println(foo.getValueForKey("a"));
        System.out.println(foo.getValueForKey("b"));
        System.out.println(foo.getValueForKey("c"));

        System.out.println(foo.getKeyForValue("Hello"));
        System.out.println(foo.getKeyForValue("World"));
    }
}

此版本允許重復的值,並返回具有給定值的所有鍵的列表:

class Foo<K, V>
{
    private final Map<K, V> keyValue;
    private final Map<V, List<K>> valueKeys;

    {
        keyValue = new HashMap<K, V>();
        valueKeys = new HashMap<V, List<K>>();
    }

    public void put(final K key, final V value)
    {
        List<K> values;

        keyValue.put(key, value);

        values = valueKeys.get(value);

        if(values == null)
        {
            values = new ArrayList<K>();
            valueKeys.put(value, values);
        }

        values.add(key);
    }

    public V getValueForKey(final K key)
    {
        return (keyValue.get(key));
    }

    public List<K> getKeyForValue(final V value)
    {
        return (valueKeys.get(value));
    }

    public static void main(final String[] argv)
    {
        Foo<String, String> foo;

        foo = new Foo<String, String>();
        foo.put("a", "Hello");
        foo.put("b", "World");
        foo.put("c", "Hello");

        System.out.println(foo.getValueForKey("a"));
        System.out.println(foo.getValueForKey("b"));
        System.out.println(foo.getValueForKey("c"));

        System.out.println(foo.getKeyForValue("Hello"));
        System.out.println(foo.getKeyForValue("World"));
    }
}

在一個類中隱藏這兩個映射是一個好主意,因為你找到了一個更好的方法,以后你需要做的就是替換類的內部,而其余的代碼保持不變。

如果使用外部庫是正常的,您應該在google集合上查看BiMap: http//google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/BiMap.html

您正在尋找的是雙向地圖。 您可以在實現BidiMap界面或Google Guava的類中的commons集合中找到它。

您正在尋找的是雙向地圖。 試試Apache Collections BidiMap。

http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/BidiMap.html

不是我知道immediatley但你可以構建一個...如何擁有一個對象的集合和幾個不存儲對象本身的查找結構(哈希映射或樹)(為了節省內存的原因)但索引到你的單一收藏? 這樣您就可以使用所需的相應查找結構(Id - > object,反之亦然)獲取一個可以索引到原始集合中的整數值。 這樣,您可以做的不僅僅是雙向查找,以防將來需要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM