Я ищу хороший способ красиво распечатать Map
.
map.toString()
дает мне: {key1=value1, key2=value2, key3=value3}
Я хочу больше свободы в значениях записей моей карты и ищу что-то более похожее на это: key1="value1", key2="value2", key3="value3"
Я написал этот маленький кусочек кода:
StringBuilder sb = new StringBuilder();
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, String> entry = iter.next();
sb.append(entry.getKey());
sb.append('=').append('"');
sb.append(entry.getValue());
sb.append('"');
if (iter.hasNext()) {
sb.append(',').append(' ');
}
}
return sb.toString();
Но я уверен, что есть более элегантный и лаконичный способ сделать это.
java
dictionary
pretty-print
space_monkey
источник
источник
System.out.println
слишком близки. И если вы хотите что-то нестандартное, это сводится к тому, «как перебирать карту в Java», что, безусловно, имеет много других ответов.Ответы:
Или поместите свою логику в аккуратный маленький класс.
Использование:
Примечание. Вы также можете поместить эту логику в служебный метод.
источник
источник
Map<String, Map<String,double[]>>
, то вы получите этот тип укуса:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
Взгляните на библиотеку Guava:
источник
Апачские библиотеки на помощь!
Все, что вам нужно, библиотека Apache commons-collection ( ссылка на проект )
Пользователи Maven могут добавить библиотеку, используя эту зависимость:
источник
Map<String, String[]>
). Только их className и hash печатаются вместо фактических значений.Просто и легко. Добро пожаловать в мир JSON. Используя Google Gson :
Пример карты с 3 ключами:
источник
Когда я
org.json.JSONObject
в классе, я делаю:(это красиво отступы списки, наборы и карты, которые могут быть вложены)
источник
Использование потоков Java 8:
источник
,
Я предпочитаю конвертировать карту в строку JSON:
поддерживает вложенные сложные типы внутри объекта
источник
Посмотрите на код
HashMap#toString()
иAbstractMap#toString()
исходные коды OpenJDK:Так что, если ребята из OpenJDK не нашли более элегантный способ сделать это, то их нет :-)
источник
Вы должны быть в состоянии делать то, что вы хотите, делая:
System.out.println(map)
напримерПока ВСЕ ваши объекты на карте имеют переопределенный
toString
метод, который вы увидите:{key1=value1, key2=value2}
значимым образомЕсли это для вашего кода, то оверинг
toString
- это хорошая привычка, и я советую вам пойти на это.Для вашего примера с вашими объектами у
String
вас все будет хорошо, ничего больше.Т.е.
System.out.println(map)
напечатать именно то что нужно без лишнего кодаисточник
java.util.Map
не имеет договора относительноtoString()
, так что это зависит от фактическойMap
реализации, что вызоветSystem.out.println(map)
->PrintStream.println(map)
->String.valueOf(map)
->map.toString()
. Бывает, что часто используемыйjava.util.AbstractMap
обеспечивает хорошее строковое представление дляtoString()
. ... ДругиеMap
реализации могут отступитьObject.toString()
, что приводит к неинформативностиcom.example.MyMap@4e8c0de
.источник
Я думаю, что-то вроде этого будет чище, и даст вам больше гибкости с выходным форматом (просто измените шаблон):
Я знаю, что убирать последнюю запятую - это ужасно, но я думаю, что она чище, чем альтернативы, подобные той, что в этом решении, или ручное использование итератора.
источник
Как быстрое и грязное решение, использующее существующую инфраструктуру, вы можете
uglyPrintedMap
использовать егоjava.util.HashMap
, а затем использоватьtoString()
.источник
Точно не отвечает на вопрос, но стоит упомянуть
@ToString
аннотацию Lombodok . Если вы пояснение@ToString
кkey / value
классам, то делатьSystem.out.println(map)
будет возвращать что - то значимое.Он также очень хорошо работает с картами карт, например:
Map<MyKeyClass, Map<String, MyValueClass>>
будет напечатан как{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }
источник
String result = objectMapper.writeValueAsString(map)
- так просто, как это!Результат:
PS добавьте Джексона JSON в ваш путь к классам.
источник
Начиная с Java 8, есть простой способ сделать это с помощью лямбды:
источник