Печать HashMap на Java


129

У меня есть HashMap:

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

Теперь я хотел бы просмотреть все значения и распечатать их.

Я написал это:

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

Похоже, это не работает.

В чем проблема?

РЕДАКТИРОВАТЬ: Другой вопрос: эта коллекция основана на нуле? Я имею в виду, что если у него 1 ключ и значение, размер будет 0 или 1?


2
Я рекомендую вам ознакомиться с документацией по Java (она ответит на многие ваши вопросы). Например, это документация для методаMap ' : «Возвращает количество сопоставлений« ключ-значение »в этой карте. Если карта содержит более элементов, возвращается ». size()Integer.MAX_VALUEInteger.MAX_VALUE
Адам Пэйнтер

Ваш код ищет значения в ключах, что неверно. Либо ищите ключ в ключах, либо значение в значениях
d-live

2
Если он имеет 1 ключ / значение, он, конечно же, будет иметь размер 1. Но это не имеет ничего общего с индексированием с нуля.
Джеспер

Это хороший вопрос. Но здесь есть ответ, который можно сделать в одной строке, если вы видите решение Mingfei.
HoldOffHunger 04

Ответы:


140

keySet () возвращает только набор ключей из вашей хэш-карты, вы должны повторить этот набор ключей и получить значение из хэш-карты, используя эти ключи.

В вашем примере тип ключа хэш-карты - это TypeKey, но вы указали TypeValueв своем универсальном цикле for, поэтому его нельзя скомпилировать. Вы должны изменить его на:

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

Обновление для Java8:

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

Если вам не нужно печатать значение ключа, а просто нужно значение хэш-карты, вы можете использовать предложения других.

Еще вопрос: это сборник с нулевой базой? Я имею в виду, что если у него 1 ключ и значение, будет ли его размер 0 или 1?

Коллекция вернулась из keySet()является набор .Вы не может получить значение из набора с помощью индекса, так что это не вопрос о том, является ли он с нуля или один основе. Если ваша хэш-карта имеет один ключ, возвращаемый keySet () будет иметь внутри одну запись, и ее размер будет равен 1.


19
Или еще лучше:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Адам Пейнтер

2
Или даже более компактный: example.forEach((key, value) -> System.out.println("key + " | " + value));
Юнес Е.О.

93

Простой способ увидеть пары ключ-значение:

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

И метод 1, и метод 2 выводят это:

[{b=2, a=1}]

21
Просто сделайте как:, System.out.println(map);вывод:{b=2, a=1}
Mingfei

Да ... еще один похожий вывод:System.out.println(map.toString());
Yo Apps

1
@yoapps в этом случае остерегайтесь NPE. Вот почему я по .toStringвозможности избегаю .
Марун

Это правда. NPE всегда скрывается за такими короткими путями. Я только хотел показать похожий результат ... Я думаю, особенно когда вы отлаживаете журнал / консоль и просто хотите заглянуть в карту, данные которой, как вы знаете, не являются нулевыми. это быстрый огонь! Но если его проверка кода с нуля ... то вы правы, это сложно и в хорошем контексте программирования, этого следует избегать!
Yo Apps

40

Предполагая, что у вас есть Map<KeyType, ValueType>, вы можете распечатать его так:

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

16

Чтобы распечатать ключ и значение, используйте следующее:

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

1
Вам не хватает другой скобки перед точкой с запятой в третьей строке.
nktsamba


9

Вам нужно установить значение, а не набор ключей:

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

Код, который вы даете, даже не компилируется, что, возможно, стоит упомянуть в будущих вопросах - «похоже, не работает» немного расплывчато!


8

Стоит упомянуть подход Java 8, использующий BiConsumerи лямбда-функции:

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

example.forEach(consumer);

Предполагая, что вы toStringпри необходимости переопределили методы двух типов.


7

Для меня эта простая строка сработала хорошо:

Arrays.toString(map.entrySet().toArray())

6

Простая инструкция печати с именем переменной, которая содержит ссылку на хэш-карту, будет делать:

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

Это работает, потому что toString()метод уже переопределен в AbstractMap classрасширении HashMap Class Дополнительная информация из документации

Возвращает строковое представление этой карты. Строковое представление состоит из списка сопоставлений "ключ-значение" в порядке, возвращаемом итератором представления entrySet карты, заключенного в фигурные скобки ("{}"). Смежные сопоставления разделяются символами «,» (запятая и пробел). Каждое сопоставление "ключ-значение" отображается как ключ, за которым следует знак равенства ("="), за которым следует связанное значение. Ключи и значения преобразуются в строки как String.valueOf (Object).


2
это кажется лучшим ответом из приведенных выше.
Каран Ахуджа

5

Новый forEachстиль функций Java 8

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

    }
}

4

Я сделал это с помощью карты строк (если вы работаете с картой строк).

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

3
map.forEach((key, value) -> System.out.println(key + " " + value));

Использование функций java 8


3
Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста , измените свой ответ , чтобы добавить объяснение, и дать указание о том , что применять ограничения и допущения.
Дэйв

2

Полезно для быстрой печати записей в HashMap

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

1

Если карта содержит коллекцию как значение, другие ответы требуют дополнительных усилий для преобразования их в строки, например Arrays.deepToString(value.toArray())(если это карта значений списка) и т. Д.

Я сталкивался с этими проблемами довольно часто и наткнулся на универсальную функцию для печати всех объектов, использующих ObjectMappers. Это очень удобно во всех местах, особенно во время экспериментов, и я бы рекомендовал вам выбрать этот способ.

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

0

Вы можете использовать Entryкласс, чтобы HashMapлегко читать .

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.