Imprimindo o HashMap em Java

Eu tenho um HashMap:

private HashMap example= new HashMap(); 

Agora gostaria de percorrer todos os valores e imprimi-los.

Eu escrevi isto:

 for (TypeValue name: this.example.keySet()){ System.out.println(name); } 

Não parece funcionar.

Qual é o problema?

EDIT: Outra pergunta: esta coleção é baseada zero? Quer dizer, se tiver 1 chave e valor, o tamanho será 0 ou 1?

keySet () retorna apenas um conjunto de chaves do seu hashmap, você deve iterar este conjunto de chaves e obter o valor do hashmap usando essas chaves.

No seu exemplo, o tipo da chave do hashmap é TypeKey , mas você especificou TypeValue em seu for-loop genérico, portanto ele não pode ser compilado. Você deve alterá-lo para:

 for (TypeKey name: example.keySet()){ String key =name.toString(); String value = example.get(name).toString(); System.out.println(key + " " + value); } 

Se você não precisar imprimir o valor da chave e precisar apenas do valor do hashmap, poderá usar as sugestões dos outros.

Outra questão: esta coleção é zero base? Quero dizer, se tiver 1 chave e valor, o tamanho será 0 ou 1?

A coleção retornada de keySet() é um Set . Você não pode obter o valor de um Set usando um índice, portanto, não é uma questão de ser baseado em zero ou em um. Se o seu hashmap tiver uma chave, o keySet () retornado terá uma input dentro e seu tamanho será 1.

Uma maneira simples de ver os pares de valores-chave:

 Map map = new HashMap<>(); map.put("a", 1); map.put("b", 2); System.out.println(Arrays.asList(map)); // method 1 System.out.println(Collections.singletonList(map)); // method 2 

O método 1 e o método 2 geram isso:

 [{b=2, a=1}] 

Supondo que você tenha um Map , você pode imprimi-lo assim:

 for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey()+" : "+entry.getValue()); } 

Você tem várias opções

  • Obtenha map.values() , que obtém os valores, não as chaves
  • Obtenha o map.entrySet() que tem ambos
  • Obtenha o keySet() e para cada chamada de chave map.get(key)

Para imprimir a chave e o valor, use o seguinte:

 for(Object objname:example.keySet()) { System.out.println(objname); System.out.println(example.get(objname); } 

Você quer o valor definido, não o conjunto de chaves:

 for (TypeValue name: this.example.values()) { System.out.println(name); } 

O código que você der nem mesmo compilar, o que pode valer a pena mencionar em futuras perguntas – “não parece funcionar” é um pouco vago!

Vale a pena mencionar a abordagem do Java 8, usando funções BiConsumer e lambda:

 BiConsumer consumer = (o1, o2) -> System.out.println(o1 + ", " + o2); example.forEach(consumer); 

Supondo que você tenha substituído o método toString dos dois tipos, se necessário.

Eu fiz isso usando o mapa String (se você estiver trabalhando com o Mapa de Cadeia).

 for (Object obj : dados.entrySet()) { Map.Entry entry = (Map.Entry) obj; System.out.print("Key: " + entry.getKey()); System.out.println(", Value: " + entry.getValue()); } 

Novo recurso do Java 8 para forEach estilo

 import java.util.HashMap; public class PrintMap { public static void main(String[] args) { HashMap example = new HashMap<>(); example.put("a", 1); example.put("b", 2); example.put("c", 3); example.put("d", 5); example.forEach((key, value) -> System.out.println(key + " : " + value)); // Output: // a : 1 // b : 2 // c : 3 // d : 5 } } 

Uma instrução simples de impressão com o nome da variável que contém a referência do Mapa de Hash faria:

 HashMap HM = new HashMap<>(); //empty System.out.println(HM); //prints key value pairs enclosed in {} 

Isso funciona porque o toString() já está sobrecarregado na AbstractMap class que é estendida pela HashMap Class Mais informações da documentação.

Retorna uma representação de string deste mapa. A representação de string consiste em uma lista de mapeamentos de valor-chave na ordem retornada pelo iterador da vista entrySet do mapa, entre chaves (“{}”). Mapeamentos adjacentes são separados pelos caracteres “,” (vírgula e espaço). Cada mapeamento de valor-chave é renderizado como a chave seguida por um sinal de igual (“=”) seguido pelo valor associado. Chaves e valores são convertidos em strings como por String.valueOf (Object).

Se o mapa contiver uma coleção como valor, as outras respostas exigirão esforço adicional para convertê-las como sequências, como Arrays.deepToString(value.toArray()) (se for um mapa de valores de lista), etc.

Eu enfrentei esses problemas com bastante frequência e me deparei com a function genérica para imprimir todos os objects usando ObjectMappers . Isto é bastante útil em todos os lugares, especialmente durante as experiências, e eu recomendo que você escolha este caminho.

 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; public static String convertObjectAsString(Object object) { String s = ""; ObjectMapper om = new ObjectMapper(); try { om.enable(SerializationFeature.INDENT_OUTPUT); s = om.writeValueAsString(object); } catch (Exception e) { log.error("error converting object to string - " + e); } return s; } 

Você pode usar a class Entry para ler facilmente o HashMap .

 for(Map.Entry temp : example.entrySet()){ System.out.println(temp.getValue()); // Or something as per temp defination. can be used }