Печать HashMap в Java

У меня есть HashMap:

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

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

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

for (TypeValue name: this.example.keySet()){

        System.out.println(name);
} 

Это не похоже на работу.

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

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

17 ответов

Решение

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

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

for (TypeKey name: example.keySet()){

            String key =name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  


} 

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

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

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

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

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

Если у вас есть Map<KeyType, ValueType>Вы можете напечатать это так:

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

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

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

У вас есть несколько вариантов

  • Получить map.values(), который получает значения, а не ключи
  • Получить map.entrySet() который имеет оба
  • Получить keySet() и для каждого ключевого звонка map.get(key)

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

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

Простой оператор print с именем переменной, который содержит ссылку на 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).

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

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

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

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

example.forEach(consumer);

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

Вы хотите установить значение, а не ключ:

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

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

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

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

Java 8 новая функция forEach стиль

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

    }
}

Я сделал это с помощью 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());
}

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

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

Используя Map.Entry, вы можете печатать так:

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

Традиционный способ получить все ключи и значения с карты, вы должны следовать этой последовательности:

  • Перерабатывать HashMap к MapSet получить набор записей в Map с entryset() метод .:
    Set dataset = map.entrySet();
  • Получите итератор этого набора:
    Iterator it = dataset.iterator();
  • Получите от итератора:
    Map.Entry entry = it.next();
  • использовать getKey() и getValue() методы Map.Entry для получения ключей и значений.
      Set dataset = (Set) map.entrySet();
Iterator it = dataset.iterator();
while(it.hasNext()){
    Map.Entry entry = mapIterator.next();
    System.out.print(entry.getKey() + " : " + entry.getValue());
}

Распечатайте карту, используя java 8

      Map<Long, String> productIdAndTypeMapping = new LinkedHashMap<>();
productIdAndTypeMapping.forEach((k, v) -> log.info("Product Type Key: " + k + ": Value: " + v));

Если карта содержит коллекцию в качестве значения, другие ответы требуют дополнительных усилий для преобразования их в строки, такие как 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;
}

Ты можешь использовать Entry класс для чтения HashMap без труда.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Другие вопросы по тегам