Печать 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?
Ответы
Ответ 1
keySet() возвращает только набор ключей из вашей хэш-карты, вы должны выполнить итерацию этого набора ключей и получить значение из хэш-карты, используя эти ключи.
В вашем примере тип ключа hashmap - 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());
});
Если вам не требуется печатать значение ключа и вам просто нужно значение hashmap, вы можете воспользоваться предложениями других.
Другой вопрос: является ли эта коллекция нулевой базой? Я имею в виду, если он имеет 1 ключ и значение, будет ли его размер 0 или 1?
Коллекция, возвращаемая из keySet()
представляет собой Set. Вы не можете получить значение из Set с помощью индекса, поэтому вопрос не в том, является ли он нулевым или единичным. Если в вашем хэш файле есть один ключ, возвращаемый ключ keySet() будет иметь одну запись внутри, а его размер будет равен 1.
Ответ 2
Простой способ увидеть пары значений ключа:
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}]
Ответ 3
Предполагая, что у вас есть Map<KeyType, ValueType>
, вы можете напечатать его следующим образом:
for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
System.out.println(entry.getKey()+" : "+entry.getValue());
}
Ответ 4
У вас есть несколько вариантов
Ответ 5
Чтобы напечатать ключ и значение, используйте следующее:
for (Object objectName : example.keySet()) {
System.out.println(objectName);
System.out.println(example.get(objectName));
}
Ответ 6
Вы хотите установить значение, а не набор ключей:
for (TypeValue name: this.example.values()) {
System.out.println(name);
}
Код, который вы даете, даже не компилируется, что, возможно, стоит упомянуть в будущих вопросах - "похоже, не работает" немного расплывчато!
Ответ 7
Стоит упомянуть подход Java 8, используя BiConsumer
и лямбда-функции:
BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) ->
System.out.println(o1 + ", " + o2);
example.forEach(consumer);
Предположим, что вы переопределили метод toString
для двух типов, если это необходимо.
Ответ 8
Я сделал это с помощью 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());
}
Ответ 9
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
}
}
Ответ 10
Простой оператор печати с именем переменной, который содержит ссылку на хэш-карту, будет делать:
HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}
Это работает, потому что метод toString()
уже перегружен в AbstractMap class
, который расширяется HashMap Class
Дополнительная информация из документации
Возвращает строковое представление этой карты. Строковое представление состоит из списка сопоставлений значений ключа в порядке, возвращаемом итератором просмотра entry entry, который заключен в фигурные скобки ( "{}" ). Смежные отображения разделяются символами "," (запятая и пробел). Каждое сопоставление значений ключей отображается как ключ, за которым следует знак равенства ( "=" ), за которым следует связанное значение. Ключи и значения преобразуются в строки как по String.valueOf(Object).
Ответ 11
Для меня эта простая строка работала хорошо:
Arrays.toString(map.entrySet().toArray())
Ответ 12
Если карта содержит коллекцию как значение, другие ответы требуют дополнительных усилий для их преобразования в виде строк, таких как 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;
}
Ответ 13
Вы можете использовать класс Entry
для легкого чтения HashMap
.
for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Ответ 14
Полезно для быстрой печати записей в HashMap
System.out.println(Arrays.toString(map.entrySet().toArray()));
Ответ 15
map.forEach((key, value) -> System.out.println(key + " " + value));
Использование функций Java 8