2013-06-21 5 views
3

Существует HashMap:Read HashMap <String, HashMap <Double, Integer>

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"); 

Вопрос заключается в том, чтобы получить Double и Integer, т.е. (1,22, 200) и (5,62, 300), в двух отдельных переменных?

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

У вас не может быть двух записей с одним и тем же ключом. Первый будет перезаписан. – GMZ

+0

@GMZ Я считаю, что записи находятся внутри карты, которая хранится под клавишей «M». – Pshemo

+0

В этом примере с одним HashMap с именем ** aircraftHandling ** и тремя записями он будет иметь только 2 записи, потому что первый (HashMap <"M", HashMap <1.22, 200>>();) будет переопределен вторым (HashMap <"M ", HashMap <5.62, 300>>();). Вот как я понял этот вопрос. – GMZ

ответ

2

Это, как вы бы извлечь ключ-значение пары в из 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>>(); 

Но если это так, то это невозможно. A 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);  
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(); 
} 
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(); 
} 
2

Во-первых, Ма p не может иметь дублирующий ключ. Если вы вставляете дубликат, то предыдущий будет исчезать. Вы можете использовать следующий код для разделения ключа и значение:

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

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

     doubleValue = entry.getKey(); 
     integerValue =entry.getValue(); 
    } 
2

с петлей Еогеаспа и методом HashMap.entrySet():

HashMap<Double, Integer> map=... 
for(Entry<Double,Integer> entry : map.entrySet()){ 
    Double d = entry.getKey(); 
    Integer i = entry.getValue(); 
} 
3

Вы можете использовать расширенный цикл только для чтения элементов:

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>.Я делаю это следующим образом:

Не считая синтаксис, используемый, поскольку ключ является String, второй раз при попытке put() значение в Map, используя String ключ, который уже существует в Mapновых значение переопределит старое значение.

1

У вас не может быть 2 значения для ключа M. Надеюсь, вы позаботились об этом, поставив значения. Вы должны поставить одну HashMap для значения М.

Вам просто нужно принести HashMap, соответствующий ключу M

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(); 
} 

EDIT - Получил ответ от моего мобильного, так что пропустил несколько деталей. Добавляем их сейчас.