Imprimindo HashMap em Java

129

Eu tenho um HashMap:

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

Agora eu 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 em zero? Quero dizer, se tem 1 chave e o valor será de 0 ou 1?

Usuário desconhecido
fonte
2
Eu recomendo que você se familiarize com a documentação do Java (ele responderá a muitas de suas perguntas). Por exemplo, esta é a documentação Mapdo size()método : "Retorna o número de mapeamentos de valores-chave neste mapa. Se o mapa contiver mais do que Integer.MAX_VALUEelementos, retornará Integer.MAX_VALUE."
Adam Paynter
Seu código está procurando Valores em Chaves - o que não está correto. Ou olhar para a chave em Chaves ou o valor em Valores
d-live
2
Se tiver 1 chave / valor, é claro que terá o tamanho 1. Mas isso não tem nada a ver com a indexação baseada em zero.
Jesper
Essa é uma boa pergunta. Mas há uma resposta aqui fornecida aqui que pode fazer isso em uma linha, se você vir a solução da Mingfei.
precisa saber é o seguinte

Respostas:

140

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

No seu exemplo, o tipo da chave do hashmap é TypeKey, mas você especificou TypeValueem seu loop for genérico, portanto 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);  
} 

Atualização para Java8:

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

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

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

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

Ken Chan
fonte
19
Ou melhor ainda:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter
2
Ou ainda mais compacto: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO
93

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

Map<String, Integer> 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}]
Mingfei
fonte
21
Apenas faça como: System.out.println(map);output:{b=2, a=1}
Mingfei 20/10
Sim ... mais uma saída semelhante:System.out.println(map.toString());
Yo Apps
1
@yoapps cuidado com o NPE neste caso. É por isso que evito .toStringquando possível.
Maroun
Isso é verdade. o NPE sempre se esconde em tais atalhos. Eu só queria mostrar uma saída semelhante. Acho que especialmente quando você está depurando em um log / console e você apenas espia um mapa cujos dados você sabe que não são nulos. este é um fogo rápido! Mas se o seu código está checando do zero ... então você está certo, é complicado e em bom contexto de programação, deve ser evitado!
Yo Apps
40

Supondo que você tenha um Map<KeyType, ValueType>, você pode imprimi-lo assim:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}
user000001
fonte
16

Para imprimir chave e valor, use o seguinte:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }
Venkatesh
fonte
1
Está faltando outro suporte antes do ponto e vírgula na terceira linha.
Nktsamba 27/02
9

Você deseja definir o valor, não o conjunto de chaves:

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

O código que você fornece nem compila, o que pode ser mencionado em perguntas futuras - "parece não funcionar" é um pouco vago!

davmac
fonte
8

Vale mencionar a abordagem Java 8, usando BiConsumere funções lambda:

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

Supondo que você substituiu o toStringmétodo dos dois tipos, se necessário.

Maroun
fonte
7

Para mim, essa linha simples funcionou bem:

Arrays.toString(map.entrySet().toArray())
KayV
fonte
6

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

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

Isso funciona porque o toString()método já está substituído no AbstractMap classque é estendido pelo HashMap Class Mais informações da documentação

Retorna uma representação de string deste mapa. A representação de cadeia consiste em uma lista de mapeamentos de valores-chave na ordem retornada pelo iterador da visualização entrySet do mapa, entre chaves ("{}"). Os 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 seqüências de caracteres como por String.valueOf (Object).

arjun gulyani
fonte
2
esta parece ser a melhor resposta das anteriores.
precisa saber é o seguinte
5

Java 8 novo forEachestilo de recurso

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> 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

    }
}
ahmet
fonte
4

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

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}
Edson Júnior
fonte
3
map.forEach((key, value) -> System.out.println(key + " " + value));

Usando os recursos do Java 8

Th0rgal
fonte
3
Embora esse código possa resolver a questão, incluindo uma explicação de como e por que isso resolve o problema realmente ajudaria a melhorar a qualidade da sua postagem e provavelmente resultará em mais votos positivos. Lembre-se de que você está respondendo à pergunta dos leitores no futuro, não apenas à pessoa que está perguntando agora. Por favor edite sua resposta para adicionar explicação, e dar uma indicação do que limitações e premissas se aplicam.
Dave
2

Útil para imprimir rapidamente entradas em um HashMap

System.out.println(Arrays.toString(map.entrySet().toArray()));
Limite
fonte
1

Se o mapa reter uma coleção como valor, as outras respostas exigirão um esforço adicional para convertê-las como seqüências de caracteres, 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 função genérica para imprimir todos os objetos usando ObjectMappers. Isso é bastante útil em todos os lugares, especialmente durante experiências, e eu recomendo que você escolha esse 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;
}
Thirukka Karnan
fonte
0

Você pode usar a Entryclasse para ler HashMapfacilmente.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Sagar Chilukuri
fonte