我应该将哪个Map类用于包含不同类型的数据?

时间:2015-05-25 07:18:42

标签: java dictionary multidimensional-array

似乎HashMap仅限于一个值,我需要一个值表,如:

  

Joe(string)25(Integer)2.0(Double)

     

史蒂夫(弦)41(整数)1.6(双)

我想像二维数组一样存储信息,但我希望它有不同的变量类型。我看一下各种Map实现类,但似乎它们只存储值(分配给一个键)或两个变量(我需要至少三个)。我应该用什么课程?

5 个答案:

答案 0 :(得分:7)

听起来您应该使用String字段,int字段和double字段创建单独的类。

然后,您可以创建一个地图,将其作为值类型,以及您喜欢的任何类型作为键。例如:

Map<String, Person> map = new HashMap<>();
// What keys do you really want here?
map.put("foo", new Person("Joe", 25, 2.0));
map.put("bar", new Person("Steve", 41, 1.6));

或者你甚至可能根本不需要地图:

List<Person> list = new ArrayList<>();
list.add(new Person("Joe", 25, 2.0));
list.add(new Person("Steve", 41, 1.6));

答案 1 :(得分:2)

使类表示您要存储的数据,例如

class Person {
    String name;
    //rest
}

然后像地图一样制作地图。地图类型无关紧要

答案 2 :(得分:1)

我建议您创建一个存储整数和双对的简单类,然后将其映射到String(我假设这是期望的结果)。

HashMap<String, Pair<Integer, Double>> map = new HashMap<String, Pair<Integer, Double>>;
map.put("Steve", new Pair<Integer, Double>(41, 1.6));

其中Pair被定义为

class Pair<T, K> {

    public T val1;
    public K val2;

    public Pair(T val1, K val2){
        this.val1 = val1;
        this.val2 = val2;
    }
}

答案 3 :(得分:1)

有很多方法可以做到这一点。

最好的方式是Jon Skeet和@ novy1234建议的方式。创建一个代表一个人的自定义类(或者表的任何行)。然后使用Map或该类的List来表示“表”。 (Map允许您选择其中一个字段/列作为键...如果合适的话。)

因此,您可能最终得到HashMap<String, Person>ArrayList<Person> ...其中Person是您的自定义类。

第二种方法是将每一行表示为Map<String,Object>,以便(例如)"name"映射到"Joe""age"映射到25"height"映射到2.0。 (他很高。)然后表格可以是这些地图的MapList

第二种方式的变体是Map<String, Map<String, Object>>,其中外部地图的键是每个人的名字,内部地图的键是字段名称;例如"age""height"

但是,当已知列集时,使用Map<String, Object>表示行不是一个好的Java解决方案。自定义类将使用比Map(任何风格)少得多的空间,并且常规getter方法比Map.get(key)方法快几个数量级。此外,Map.get(...)方法将返回一个Object,必须先将其转换为预期类型才能使用它。类型转换可能会在运行时失败,因为您(不知何故)错误地填充了行/映射。

如果在编译时未知列,或者如果稀疏地填充了无法管理的列数,那么您应该只考虑使用Map来表示表中的行。 (这里也不是这样......)

那么,你应该使用哪个Map课程?

您的替代方案包括HashMapTreeMapLinkedHashMapConcurrentHashMap。每个人都有不同的属性和不同的目标用例。但是,如果您的桌子很小,并且没有特定要求,那么它可能没有什么区别。

答案 4 :(得分:0)

创建一个节点来存储整数和双精度值?