Ao usar um HashMap são valores e chaves garantidos para ser na mesma ordem quando a iteração?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Quando eu repetir os valores ou chaves é que eles vão correlato? Será o segundo mapa chave para o segundo valor?

Foi útil?

Solução

Não, não necessariamente. Você realmente deve usar o entrySet (). Iterator () para esta finalidade. Com este iterador, você estará andando por toda Map.Entry objetos no mapa e pode acessar cada chave e valor associado.

Outras dicas

para utilizar o entrySet que @Cuchullain mencionado:

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
}

Você quer usar isso, LinkedHashMap , por ordem de iteração previsível

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

Ambos os valores () e keySet () delegar ao entrySet () iterator para que eles serão devolvidos na mesma ordem. Mas, como Alex diz que é muito melhor usar o entrySet () iterator diretamente.

Eu concordo com pmac72. Não assuma que você vai obter valores ou chaves encomendado a partir de uma coleção não-ordenada. Se ele funciona tempos em tempos, é apenas puro acaso. Se você quiser a fim de ser preservado, use uma LinkedHashMap ou um TreeMap ou commons coleções OrderedMap.

A pergunta me confundiu no começo, mas @ Matt limpou-lo para mim.

Considere usar o método entrySet () que retorna um conjunto com os pares chave-valor no mapa.

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

Esta saídas:

1 => 2
2 => 3
3 => 3

Eu segunda @basszero. Enquanto

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

vai funcionar, acho que usando uma estrutura de dados que faz isso é mais agradável automaticamente. Agora, você pode apenas iterate "normalmente"

método keySet de HashMap retorna um conjunto, que não fim garantia.
Os valores da HashMap () retorna uma coleção, que não ordena garantia.

Dito isto, a questão era "eles estão indo para correlato" então tecnicamente a resposta é, talvez, mas não contar com ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top