2015-05-25 26 views
0

似乎HashMap被限制为仅一个值,我需要像的数值表:哪个Map类应该用于包含不同类型的数据?

乔(字符串)25(整数)2.0(双)

史蒂夫(字符串)41(整数)1.6(双)

欲信息来源存储类似于在二维阵列,但我希望它具有不同的变量类型。我看过各种Map实现类,但它们似乎只存储值(分配给一个键)或两个变量(我至少需要三个)。我应该使用什么类?

+0

在地图上存储地图 – Babel

+0

@looser能详细说明一下吗? –

回答

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)); 
+0

我假设OP想要将名称映射为整数和双精度,所以也许人们的名字应该用作键,而不是“foo”和“bar”。 – SamTebbs33

+1

@ SamTebbs33:我故意让他们有所不同,以表明否则就会有冗余 - 正如我之前所说的,目前还不清楚是否需要映射。已经添加了一条评论来提示OP对此进行更多的思考。 –

0

让一个节点同时存储整数和双精度值?

2

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

class Person { 
    String name; 
    //rest 
} 

然后使地图像地图。地图类型无关

1

我会建议你创建一个简单的类,存储整数和双对,然后映射到一个字符串(我认为这是所需的结果)。

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

凡对被定义为

class Pair<T, K> { 

    public T val1; 
    public K val2; 

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

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

最好的方法是Jon Skeet和@ novy1234建议的方式。创建一个代表一个人的自定义类(或者表中的任何行)。然后使用该类的Map或List来表示“表”。 (地图,您可以选择字段/列作为一个重点之一......如果这是适当的。)

所以,你可能最终得到一个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类?

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

相关问题