Печать 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
}