При использовании HashMap гарантированно ли значения и ключи будут находиться в одном и том же порядке при повторении?

StackOverflow https://stackoverflow.com/questions/128008

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

чтобы использовать набор записей, о котором упоминал @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
}

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

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

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

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

Сначала этот вопрос сбил меня с толку, но @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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top