Java: print_r?

в прошлый раз я спросил, как заполнить структуру данных здесь. Теперь я хотел бы знать, есть ли что-то в Java, например print_r, которое я использую в PHP, для представления того, что я заполнил в Картах и ​​списках, без необходимости выполнять свой собственный алгоритм.

Есть идеи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
0
26 540
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Вызов toString в коллекции должен возвращать строку, содержащую все строковые представления элементов.

Однако это не будет работать со встроенными массивами, поскольку они не имеют переопределения toString и просто дадут вам адрес памяти.

Я пробовал это в пользовательском классе, и он выводит ClassName@<address_value>. Что использовать в настраиваемом классе?

trusktr 08.12.2012 15:17

@trusktr Для пользовательских классов вы должны переопределить метод toString(), чтобы он возвращал то, что вы хотите.

Sentry 17.04.2013 03:08

Я не знаю эквивалента print_r в java.

Но...

Каждый объект имеет реализацию по умолчанию для метода toString (), реализации списка и карты распечатывают их содержимое, если вы вызываете для них toString ().

Если вам нужна распечатанная отладочная информация, возможно, вы ищете toString ().

Вы можете попробовать старый добрый Apache Commons Lang's ToStringBuilder.

В Java нет эквивалента print_r.

Но для карт или списков вы можете использовать цикл foreach следующим образом:

List <String> list = …; // fills your list 

// print each list element 

for (String s : list) {

   System.out.println(s);

 }

вы также можете использовать для этого итератор .. List <String> list = ...; Итератор итератор; итератор = list.iterator (); while (iterator.hasNext ()) {System.out.println (iterator.next () + ","); }

Jean Paul Galea 29.09.2008 14:57

цикл foreach в java (в любом случае IMO) намного более чистый синтаксис, чем итераторы, и я считаю, что он в любом случае использует итераторы под поверхностью.

workmad3 29.09.2008 19:17

Для массивов проще всего использовать Arrays.asList (array) .toString (). Обычно я использую toString () для объектов, которые мне нравятся при отладке. Однако для сгенерированных объектов (JAXB и т. д.) Может потребоваться создать служебный класс для его печати.

В Java 1.5 вместо этого можно использовать Arrays.toString (array).

Michael Myers 29.09.2008 19:10

Другие упомянули метод toString(). Это действительно полезно только тогда, когда объект реализует toString(). Если он не был реализован должным образом, вы получите что-то вроде этого: java.lang.Object@1b9240e.

Даже если это немного утомительно, все же легко реализовать toString() в ваших собственных классах, но сторонние классы не всегда будут его реализовывать. Намного лучше использовать отладчик. Единственная причина, по которой такие вещи, как print_r, вообще существуют в PHP, - это отсутствие настоящего отладчика. Я думаю, вы обнаружите, что возможность устанавливать точки останова вместо использования набора диагностических операторов печати приведет к гораздо более быстрому рабочему процессу и более чистому коду.

привет, приятель :) Да, я хотел что-то вроде print_r, потому что я не думал об использовании отладчика, поскольку, как вы сказали, я никогда не использовал его с PHP. Я посмотрю, как я могу использовать отладчик с Java! :)

Jean Paul Galea 29.09.2008 19:19

Приличный набор журналов неоценим при использовании с отладчиком, поскольку он позволяет вам отследить определенную функцию намного быстрее, чем переходить через отладчик. Ведение журнала также полезно в коде производственного режима, поскольку часто это единственная запись о проблеме.

workmad3 29.09.2008 21:47

В зависимости от того, что именно вы хотите сделать, решение может быть довольно простым. Следующее не будет производить форматированный вывод, который предоставляет print_r, но позволит вам выводить структуру списков, массивов и карт:

    // Output a list
    final List<String> list = new ArrayList<String>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    System.out.println(list);

    // Output an array
    final String[] array = {"four", "three", "two", "one"};
    System.out.println(Arrays.asList(array));

    // Output a map
    final Map<String, String> map = new HashMap<String, String>();
    map.put("one", "value");
    map.put("two", "value");
    map.put("three", "value");
    System.out.println(map.entrySet());

Для других типов объектов вы можете использовать отражение, чтобы создать утилита для этой цели.

На самом деле существует разница между toString () в java и print_r () в PHP. Обратите внимание, что в php также есть __toString (), который эквивалентен toString () в java, так что это не совсем ответ.

print_r используется, когда у нас есть структура объектов, и мы хотим быстро увидеть полный график объектов с их значениями.

Реализация toString в java для каждого объекта не имеет возможности сравнивать с print_r.

Вместо этого используйте gson. Он выполняет ту же работу, что и print_r

Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(someObject));

Таким образом, вам не нужно реализовывать toString для каждого объекта, который вам нужен для его тестирования.

Вот документация: http://sites.google.com/site/gson/gson-user-guide

Демо-классы (на java):

public class A {

int firstParameter = 0;
B secondObject = new B();

}

public class B {

String myName = "this is my name";  

}

Вот результат на php с print_r:

Object
(
[firstParameter:private] => 0
[secondObject:private] => B Object
(
[myName:private] => this is my name
)

)

Вот результат в java с gson:

{
"firstParameter": 0,
"secondObject": {
"myName": "this is my name"
}
}

хороший способ сделать это. Но одно: мне нужен более простой способ сделать это без какой-либо сторонней библиотеки.

Kishan Kumar 13.01.2017 09:39

Я считаю, что функциональность, подобная Java print_r, - это класс Рекурсивный дамп, который я написал. Это не идеально, но мне это нравится. Использование:

String output = RecursiveDump.dump(...);

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

Я думал использовать Reflection для извлечения имен полей для классов без надлежащего toString(), но поскольку Spring Roo@RooToString может написать для вас метод toString() ...

Конечно, альтернативой является использование инструмента инспектора отладчика, но иногда быстрее использовать распечатки.

Другие вопросы по теме