似乎HashMap
被限制为仅一个值,我需要像的数值表:哪个Map类应该用于包含不同类型的数据?
乔(字符串)25(整数)2.0(双)
史蒂夫(字符串)41(整数)1.6(双)
等
欲信息来源存储类似于在二维阵列,但我希望它具有不同的变量类型。我看过各种Map实现类,但它们似乎只存储值(分配给一个键)或两个变量(我至少需要三个)。我应该使用什么类?
似乎HashMap
被限制为仅一个值,我需要像的数值表:哪个Map类应该用于包含不同类型的数据?
乔(字符串)25(整数)2.0(双)
史蒂夫(字符串)41(整数)1.6(双)
等
欲信息来源存储类似于在二维阵列,但我希望它具有不同的变量类型。我看过各种Map实现类,但它们似乎只存储值(分配给一个键)或两个变量(我至少需要三个)。我应该使用什么类?
听起来你应该创建一个带有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));
我假设OP想要将名称映射为整数和双精度,所以也许人们的名字应该用作键,而不是“foo”和“bar”。 – SamTebbs33
@ SamTebbs33:我故意让他们有所不同,以表明否则就会有冗余 - 正如我之前所说的,目前还不清楚是否需要映射。已经添加了一条评论来提示OP对此进行更多的思考。 –
让一个节点同时存储整数和双精度值?
使表示要存储的数据的类,例如。
class Person {
String name;
//rest
}
然后使地图像地图。地图类型无关
我会建议你创建一个简单的类,存储整数和双对,然后映射到一个字符串(我认为这是所需的结果)。
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;
}
}
有许多方法可以做到这一点。
最好的方法是Jon Skeet和@ novy1234建议的方式。创建一个代表一个人的自定义类(或者表中的任何行)。然后使用该类的Map或List来表示“表”。 (地图,您可以选择字段/列作为一个重点之一......如果这是适当的。)
所以,你可能最终得到一个HashMap<String, Person>
或ArrayList<Person>
...其中Person
是你的自定义类。
第二种方法是将表示各行作为Map<String,Object>
,使得(例如)"name"
映射到"Joe"
,"age"
映射到25
和"height"
映射到2.0
。 (他很高)。那么表格可以是这些地图的Map
或List
。
第二种方式的变化是Map<String, Map<String, Object>>
,其中外部地图的键是每个人的名字,内部地图的键是字段名;例如"age"
和"height"
。
但是,当已知列集时,使用Map<String, Object>
来表示一行并不是一个好的Java解决方案。自定义类将使用比Map
(任何味道)少得多的空间,并且常规getter
方法比Map.get(key)
方法快几个数量级。另外,Map.get(...)
方法会返回给您一个Object
,它必须在使用前转换为预期的类型。在运行时,类型转换会有失败的风险,因为你(以某种方式)错误地填充了行/映射。
如果在编译时不知道列,或者如果有稀疏填充的列数不可控,则应该只考虑使用Map来表示表中的行。 (这里也不是这种情况......)
那么,您应该使用哪个Map
类?
您的替代品包括HashMap
,TreeMap
,LinkedHashMap
和ConcurrentHashMap
。每个人都有不同的属性和不同的目标用例。但是,如果你的桌子很小,并且没有特定的要求,那么它可能没有真正的区别。
在地图上存储地图 – Babel
@looser能详细说明一下吗? –