Печать HashMap в Java
У меня есть HashMap:
private HashMap example= new HashMap();
Теперь я хотел бы пробежать все значения и распечатать их.
Я написал это:
- Как скопировать файл java.util.List в другой файл java.util.List
- Разница между и в Java
- Максимальный размер HashSet, Vector, LinkedList
- Какой тип использует Java Collections.sort (узлы)?
- В чем разница между упорядоченной и сортированной коллекцией?
for (TypeValue name: this.example.keySet()){ System.out.println(name); }
Кажется, это не работает.
В чем проблема?
EDIT: Другой вопрос: основана ли эта коллекция на ноль? Я имею в виду, если он имеет 1 ключ, а значение будет 0 или 1?
- Разница между перечислением Java и iteratorом
- Как включить список списков в список в Java 8?
- Как сортировать в алфавитном порядке, игнорируя регистр?
- Какую сборку Java я должен использовать?
- Фильтр ArrayList
- Java: лучший способ итерации через коллекцию (здесь ArrayList)
- Публикация / подписка на несколько подмножеств одной и той же серверной коллекции
- какова хорошая постоянная структура коллекций для использования в java?
keySet () возвращает только набор ключей из вашей hash-карты, вы должны перебрать этот набор ключей и получить значение из hash-карты, используя эти ключи.
В вашем примере типом ключа TypeKey
является TypeKey
, но вы указали TypeValue
в своем родовом for-loop, поэтому его невозможно скомпилировать. Вы должны изменить его на:
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()
представляет собой набор. Вы не можете получить значение из набора с использованием индекса, поэтому не вопрос о том, основан ли он на основе нуля или на основе одного. Если у вашего hashmap есть один ключ, возвращаемый keySet () будет иметь одну запись внутри, а его размер будет равен 1.
Простой способ увидеть пары ключевых значений:
Map 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
, вы можете ее напечатать следующим образом:
for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey()+" : "+entry.getValue()); }
У вас есть несколько вариантов
- Получите
map.values()
, который получает значения, а не ключи - Получите
map.entrySet()
который имеет как - Получите
keySet()
и для каждого ключевого вызоваmap.get(key)
Чтобы напечатать как ключ, так и значение, используйте следующее:
for(Object objname:example.keySet()) { System.out.println(objname); System.out.println(example.get(objname); }
Вы хотите установить значение, а не набор ключей:
for (TypeValue name: this.example.values()) { System.out.println(name); }
Код, который вы даете, даже не компилируется, что, возможно, стоит упомянуть в будущих вопросах – «кажется, не работает», немного расплывчато!
Стоит упомянуть подход Java 8, используя функции BiConsumer
и lambda:
BiConsumer consumer = (o1, o2) -> System.out.println(o1 + ", " + o2); example.forEach(consumer);
Предполагая, что вы переопределили метод toString
двух типов, если это необходимо.
Я сделал это, используя карту String (если вы работаете со String Map).
for (Object obj : dados.entrySet()) { Map.Entry entry = (Map.Entry) obj; System.out.print("Key: " + entry.getKey()); System.out.println(", Value: " + entry.getValue()); }
Java 8 новая функция для forEach
стиля
import java.util.HashMap; public class PrintMap { public static void main(String[] args) { HashMap 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 } }
Простой оператор печати с именем переменной, который содержит ссылку на Hash-карту, будет делать следующее:
HashMap HM = new HashMap<>(); //empty System.out.println(HM); //prints key value pairs enclosed in {}
Это работает, потому что метод toString()
уже переопределен в AbstractMap class
который расширяется HashMap Class
Дополнительная информация из документации
Возвращает строковое представление этой карты. Строковое представление состоит из списка сопоставлений значений ключа в порядке, возвращаемом iteratorом вида entrySet, заключенным в фигурные скобки («{}»). Смежные отображения разделяются символами «,» (запятая и пробел). Каждое сопоставление значений ключей отображается как ключ, за которым следует знак равенства («=»), за которым следует связанное значение. Ключи и значения преобразуются в строки как по String.valueOf (Object).
Если карта содержит коллекцию как значение, другие ответы требуют дополнительных усилий для их преобразования в виде строк, таких как 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; }
Вы можете использовать class Entry
чтобы легко читать HashMap
.
for(Map.Entry temp : example.entrySet()){ System.out.println(temp.getValue()); // Or something as per temp defination. can be used }