3

有一个HashMap

HashMap aircraftHandling = new HashMap<String, HashMap<Double, Integer>>();

HashMap包含以下条目:

HashMap<"M", HashMap<1.22, 200>>();
HashMap<"M", HashMap<5.62, 300>>();
HashMap<"L", HashMap<10.11, 900>>();

我需要获取键“M”的条目,即HashMap<1.22, 200>HashMap<5.62, 300>. 我通过以下方式执行此操作:

HashMap lines = (HashMap<Double, Integer>) aircraftHandling.get("M");

问题是如何将DoubleInteger即 (1.22, 200) 和 (5.62, 300) 变成两个独立的变量?

for (int i=0; i<lines.size(); i++)
{
  //doubleValue = [i]???
  //integerValue = [i]???
}
4

7 回答 7

3

您可以使用增强的 for 循环来读取元素:

for (Map.Entry<Double, Integer> entry : lines.entrySet()) {
   Double key = entry.getKey();
   Integer value = entry.getValue();
}

此 HashMap 包含以下条目:

HashMap<"M", HashMap<1.22, 200>>();
HashMap<"M", HashMap<5.62, 300>>();
HashMap<"L", HashMap<10.11, 900>>();

我需要获取键“M”的条目,即 HashMap<1.22, 200> 和 HashMap<5.62, 300>。我通过以下方式执行此操作:

不考虑使用的语法,因为键是 a String,第二次尝试使用新值中已经存在的put()键中的值将覆盖旧值。MapStringMap

于 2013-06-21T08:32:05.013 回答
2

这是通过迭代 keyset来提取 的键值对的方法:HashMap

Iterator<Double> it= lines.keySet().iterator();
while (it.hasNext()) {
    Double key= it.next();
    Integer value= lines.get(key);
}

在旁注中,我不知道这是否是一个错误,或者只是您的数据的错误表示:

HashMap<"M", HashMap<1.22, 200>>();
HashMap<"M", HashMap<5.62, 300>>();

但是,如果它是它看起来的样子,这是不可能的。一个Map键可以有一个值!这意味着,如果您为某个键设置了一些值,"M"然后对同一个键再次执行此操作,则后者将覆盖先前的值。你应该做的是:

//get the inner map for "M"
HashMap<Double, Integer> innerMap= aircraftHandling.get("M");
if (innerMap == null) {
    //if it does not exist instantiate it
    innerMap= new HashMap<Double, Integer>();
    aircraftHandling.put("M", innerMap);
}

现在,在innerMap您添加其他值,例如:

innerMap.put(1.22, 200);
innerMap.put(5.62, 300);    
于 2013-06-21T08:27:16.043 回答
2

试试这种方式

Map<Double, Integer> lines = (HashMap<Double, Integer>) aircraftHandling.get("M");
// ^add this generic types here so you wont have to cast them later with getters
for (Map.Entry<Double, Integer> entry:lines.entrySet()){
    Double key = entry.getKey();
    Integer value = entry.getValue();
}
于 2013-06-21T08:30:30.300 回答
2

在这里你有它:

HashMap<String, HashMap<Double, Integer>> aircraftHandling = new HashMap<String,    HashMap<Double, Integer>>();

HashMap<Double, Integer> subMap1 = new HashMap<Double, Integer>();
subMap1.put(1.22, 200);

HashMap<Double, Integer> subMap2 = new HashMap<Double, Integer>();
subMap1.put(5.62, 300);

aircraftHandling.put("M", subMap1);
aircraftHandling.put("L", subMap2);

HashMap<Double, Integer> lines = aircraftHandling.get("M");

for (Entry<Double, Integer> set : lines.entrySet()) {
    Double doubleValue = set.getKey();
    Integer integerValue = set.getValue();
}
于 2013-06-21T08:31:22.497 回答
2

首先,Map 不能有重复的键。如果插入重复键,则前一个键将消失。您可以使用以下代码来分隔键和值:

     HashMap lines = (HashMap<Double, Integer>) aircraftHandling.get("M");

     for(Map.Entry<Double, Integer> entry: lines ){

        doubleValue = entry.getKey();
        integerValue =entry.getValue();
     }
于 2013-06-21T08:31:29.010 回答
2

使用 foreach 循环和方法HashMap.entrySet()

HashMap<Double, Integer> map=...
for(Entry<Double,Integer> entry : map.entrySet()){
   Double d = entry.getKey();
   Integer i = entry.getValue();
}
于 2013-06-21T08:31:29.897 回答
1

您不能为键 M 设置 2 个值。我希望您在输入值时已经处理了这一点。您应该为值 M 放置一个哈希图。

您只需要获取与键 M 对应的 hashmap

HashMap lines = (HashMap<Double, Integer>) aircraftHandling.get("M");

然后遍历此映射中的所有条目

Iterator it = lines.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    double d = pairs.getKey().doubleValue();
    int i = pairs.getValue().intValue();
}

编辑 - 已通过我的手机回答,所以错过了一些细节。现在添加它们。

于 2013-06-21T08:34:11.117 回答