Когда я повторяю значения или клавиши, они будут коррелировать? Будет ли вторая ключевая карта ко второму значению?При использовании HashMap значения и ключи гарантируются в том же порядке при повторении?
ответ
Нет, не обязательно. Для этой цели вам действительно нужно использовать функцию entrySet(). Iterator(). С помощью этого итератора вы пройдете через все объекты Map.Entry на карте и сможете получить доступ к каждому ключу и связанному с ним значению.
Вопрос путал меня сначала, но @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
Оба значения() и keySet() делегируют итератору entrySet(), поэтому они будут возвращены в том же порядке. Но, как говорит Алекс, гораздо лучше использовать итератор entrySet().
использовать entrySet, что @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, для предсказуемого порядка итерации
Я второй @basszero. Пока
for (Map.Entry<Integer, Integer> entry : a.entrySet())
будет работать, я нахожу использование структуры данных, которая делает это автоматически более приятным. Теперь вы можете просто переименовать «обычно»
Метод keySet HashMap возвращает набор, который не гарантирует порядок.
Метод value() метода HashMap возвращает коллекцию, которая не гарантирует порядок.
Тем не менее, вопрос был «они будут коррелировать», так что технически ответ может быть, но не полагаться на него.
Я согласен с pmac72. Не предполагайте, что вы получите упорядоченные значения или ключи из неупорядоченной коллекции. Если это время от времени, это просто чистая опасность. Если вы хотите, чтобы заказ сохранялся, используйте привязку LinkedHashMap или TreeMap или коллекцию CommonsMap.
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
Я думал, что это то, о чем вначале речь шла, но звучит так, будто он итерации по ключам и значениям независимо использует методы .keys() и .values (). Я не думаю, что LinkedHashMap решает проблему в этом случае – Matt 2008-09-24 16:04:13
Спасибо Мэтту - меня там путают :). – 2008-09-24 16:06:07
С другой стороны, вы никогда не должны создавать HashMap того же размера, что и количество ожидаемых элементов. У HashMaps есть loadfactor, который обычно составляет 75%. Это означает, что если карта заполнена на 75%, и вы добавите элемент, это увеличит ее размер. – 2008-09-24 18:42:30