【发布时间】:2011-02-20 11:24:11
【问题描述】:
我正在从一个文本文件中读取数据,并希望将 HashMap 存储在另一个 HashMap 中。
HashMap<string,HashMap<string,value>>
如何存储和检索数据? 任何示例代码将不胜感激... 谢谢你
【问题讨论】:
我正在从一个文本文件中读取数据,并希望将 HashMap 存储在另一个 HashMap 中。
HashMap<string,HashMap<string,value>>
如何存储和检索数据? 任何示例代码将不胜感激... 谢谢你
【问题讨论】:
例子:
创建和填充地图
Map<String, Map<String, Value>> outerMap = new HashMap<String, HashMap<String, Value>>();
Map<String, Value> innerMap = new HashMap<String, Value>();
innerMap.put("innerKey", new Value());
存储地图
outerMap.put("key", innerMap);
检索地图及其值
Map<String, Value> map = outerMap.get("key");
Value value = map.get("innerKey");
【讨论】:
String带有一个上S。
创建两个简单的 Hashmap:InnerMap 和 OuterMap
HashMap<String, HashMap<String, String>> outerMap = new HashMap<String, HashMap<String,String>>();
HashMap<String, String> innerMap = new HashMap<String, String>();
填充哈希映射
innerMap.put("InnerKey", "InnerValue");
outerMap.put("OuterKey", innerMap);
从 HashMap 中检索值
String value = ((HashMap<String, String>)outerMap.get("OuterKey")).get("InnerKey").toString();
System.out.println("Retreived value is : " + value);
【讨论】:
outerMap中的每个键,存储innerMap的相同实例是没有用的,它与没有outerMap相同。您应该为outerMap 中的每个新键创建一个“内部映射”的新实例。
你得到的东西看起来像一个二维 HashMap,可以这么说。这意味着您需要 2 个字符串来存储一个值,也需要检索一个。
例如,您可以编写一个类来包装这种复杂性,就像那样(未经测试的代码):
public class HashMap2D<T> {
private HashMap<String,HashMap<String,T>> outerMap;
public HashMap2D() {
outerMap = new HashMap<String,HashMap<String,T>>();
}
public void addElement(String key1, String key2, T value) {
innerMap=outerMap.get(key1);
if (innerMap==null) {
innerMap = new HashMap<String,T>();
outerMap.put(key1,innerMap);
}
innerMap.put(key2,value);
}
public T getElement(String key1, String key2) {
Hashmap innerMap = outerMap.get(key1);
if (innerMap==null) {
return null;
}
return innerMap.get(key2);
}
}
如果您希望方法一次处理多个数据,则更复杂,但遵循相同的原则。
【讨论】:
这将通过使用双键将两个嵌套地图展平为一张大地图来解决使用一张地图的相同问题(尽管这并不能直接回答您的问题)。
public class Key2D{
private final String outer;
private final String inner;
public Key2D(String outer, String inner){
this.outer = outer;
this.inner = inner;
}
//include default implementations for
//Object.equals(Object) and Object.hashCode()
//Tip: If you're using Eclipse it can generate
//them for you.
}
然后用双键创建一张地图:
Map<Key2D, Value> map = new HashMap<Key2D, Value>();
map.put(new Key2D("outerKey", "innerKey"), "Value");
map.get(new Key2D("outerKey", "innerKey")); // yields "Value"
这给出了一个更短的解决方案。性能方面可能差不多。内存性能可能稍好一些(不过只是猜测)。
【讨论】:
HashMap 中的HashMap 会导致可读性问题,尤其是当它超出两个级别时。我假设当您从文本文件中读取数据时,您希望对来自行和列的输入进行分类,这应该类似于多级类别或类别中的类别。如果您可以发布示例数据和您的意图,我可以提出一个自定义类示例。
public class Category {
private List<Category> subCategories;
private List<Item> items;
}
上述数据结构将帮助您在对数据进行分类时解决任何级别的嵌套。此示例特定于商店商品的分类。
【讨论】: