Друк 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. Але це не має нічого спільного з нульовою індексуванням.
Jesper

Це гарне запитання. Але тут надана відповідь, яка може зробити це в одному рядку, якщо ви бачите рішення Мінгфей.
HoldOffHunger

Відповіді:


140

keySet () повертає лише набір ключів із вашої хешмапу, вам слід повторити цей набір ключів і отримати значення з хешмапу за допомогою цих клавіш.

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

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));
Younes EO

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коли це можливо.
Maroun

Це правда. 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
Вам не вистачає ще однієї дужки перед напівкрапкою на 3-му рядку.
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

Простий оператор друку з назвою змінної, який містить посилання на Hash Map, зробив би:

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

Я зробив це за допомогою String map (якщо ви працюєте зі String Map).

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.