При использовании HashMap значения и ключи гарантированно будут в том же порядке при итерации? - PullRequest
9 голосов
/ 24 сентября 2008

Когда я переберу значения или ключи, они будут коррелировать? Будет ли второй ключ сопоставляться со вторым значением?

Ответы [ 9 ]

14 голосов
/ 24 сентября 2008

Нет, не обязательно. Вы должны действительно использовать entrySet (). Iterator () для этой цели. С помощью этого итератора вы пройдете по всем объектам Map.Entry на карте и сможете получить доступ к каждому ключу и соответствующему значению.

8 голосов
/ 24 сентября 2008

для использования записи, указанной @Cuchullain:

Map<String, String> map = new HashMap<String, String>();

// populate hashmap

for (Map.Entry<String, String> entry : map.entrySet()) {
  String key = entry.getKey();
  String value = entry.getValue();
  // your code here
}
7 голосов
/ 24 сентября 2008

Вы хотите использовать это, LinkedHashMap , для предсказуемого порядка итерации

3 голосов
/ 09 ноября 2009
public class Test {
 public static void main(String[] args) {
  HashMap <String,String> hashmap = new HashMap<String,String>();
  hashmap.put("one", "1");
  hashmap.put("two", "2");
  hashmap.put("three", "3");
  hashmap.put("four", "4");
  hashmap.put("five", "5");
  hashmap.put("six", "6");

  Iterator <String> keyIterator   = hashmap.keySet().iterator();
  Iterator <String> valueIterator = hashmap.values().iterator();

  while(keyIterator.hasNext()) {
   System.out.println("key: "+keyIterator.next());
  }

  while(valueIterator.hasNext()) {
   System.out.println("value: "+valueIterator.next());
  }
 }
}

key: two
key: five
key: one
key: three
key: four
key: six
value: 2
value: 5
value: 1
value: 3
value: 4
value: 6
2 голосов
/ 24 сентября 2008

Оба значения () и keySet () делегируют итератору entrySet (), поэтому они будут возвращены в том же порядке. Но, как говорит Алекс, гораздо лучше использовать итератор entrySet () напрямую.

1 голос
/ 03 марта 2009

Я согласен с pmac72. Не думайте, что вы получите упорядоченные значения или ключи из неупорядоченной коллекции. Если это работает время от времени, это просто чистая опасность. Если вы хотите сохранить порядок, используйте LinkedHashMap или TreeMap или общие коллекции OrderedMap.

0 голосов
/ 24 сентября 2008

Метод keySet HashMap возвращает Set, который не гарантирует порядок.
Метод values ​​() в HashMap возвращает коллекцию, которая не гарантирует порядок.

Тем не менее, вопрос был "собираются ли они соотноситься", так что технически ответ может быть, но не полагайтесь на него.

0 голосов
/ 24 сентября 2008

Я второй @basszero. В то время как

for (Map.Entry<Integer, Integer> entry : a.entrySet()) 

будет работать, я считаю, что использование структуры данных, которая делает это автоматически, лучше. Теперь вы можете просто повторить "обычно"

0 голосов
/ 24 сентября 2008

Сначала вопрос меня смутил, но @Matt прояснил его для меня.

Попробуйте использовать метод entrySet (), который возвращает набор с парами ключ-значение на карте.

Map<Integer, Integer> a = new HashMap<Integer, Integer>(2);
a.put(1, 2);
a.put(2, 3);
for (Map.Entry<Integer, Integer> entry : a.entrySet()) {
    System.out.println(entry.getKey() + " => " + entry.getValue());
}

Это выводит:

1 => 2
2 => 3
3 => 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...