在Java中使用“多维”列表的最佳数据结构是什么?

时间:2009-10-05 03:02:56

标签: java list data-structures

我需要一个类似字典的数据结构来存储信息,如下所示:

key [value 1] [value 2] ...

我需要能够通过提供密钥和我想要的值(值的数量是常数)来查找给定值。哈希表是我想到的第一件事,但我认为它不能用于多个值。有没有办法用单个数据结构执行此操作,而不是将每个键值对拆分为单独的列表(或哈希表)?此外,我宁愿不使用多维数组,因为事先不知道条目数。感谢

4 个答案:

答案 0 :(得分:1)

我不确定您对值列表的意思,并查找给定值。这基本上是名称 - 值对的键控列表吗?或者您想按索引指定值?

如果是后者,你可以使用包含ArrayLists的HashMap - 我假设这些值是String,如果键也是String,它看起来像这样:


    HashMap<String, ArrayList<String>> hkansDictionary = new HashMap<String, ArrayList<String>>();

    public String getValue (String key, int valueIdx) {
        ArrayList<String> valueSet = hkansDictionary.get(key);
        return valueSet.get(valueIdx);
    }

如果是前者,您可以使用包含HashMaps的HashMap。这看起来更像是这样:


    HashMap<String, HashMap<String, String>> hkansDictionary 
              = new HashMap<String, HashMap<String, String>>();
    ----
    public String getValue (String key, String name) {
        HashMap<String, String> valueSet = hkansDictionary.get(key);
            return valueSet.get(name);
    }

答案 1 :(得分:0)

您可以创建一个包含要查找的两个键值的类,实现equals()和hashcode()以检查/组合对基础值的调用,并使用此新类作为Map的键。

答案 2 :(得分:0)

我会用

Map<Key,ArrayList<String>> map = new HashMap<Key,ArrayList<String>>

您将Key定义为

public class Key{
    private String key;
    private String value;
    //getters,setters,constructor

    //implement equals and hashcode and tostring
}

然后你可以做

Key myKey = new Key("value","key");
map.get(myKey);

将返回N个项目列表

答案 3 :(得分:0)

您可以通过首先声明它来创建多维数组,然后创建一个方法以确保在put之前初始化新的值键。此示例使用带有嵌入式列表的地图,但您可以使用地图地图或任何您想要的地图。

即,您必须定义自己的 put 方法来处理新值初始化 ,如下所示:

private static Map<String, List<USHCommandMap>> uSHCommandMaps = new HashMap<String, List<USHCommandMap>>();

public void putMemory() {

        if (!uSHCommandMaps.containsKey(getuAtom().getUAtomTypeName()))
            uSHCommandMaps.put(getuAtom().getUAtomTypeName(), new ArrayList<USHCommandMap>());

        uSHCommandMaps.get(getuAtom().getUAtomTypeName()).add(this);

    }