Java: print_r? - PullRequest
       25

Java: print_r?

17 голосов
/ 29 сентября 2008

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

Есть идеи?

Ответы [ 9 ]

9 голосов
/ 11 мая 2011

Существует действительно разница между 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):

публичный класс A {

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

}

публичный класс B {

String myName = "this is my name";  

}

Вот вывод в php с print_r:

Object
(
[firstParameter: private] => 0
[secondObject: private] => B Object
(
[myName: private] => это мое имя
)

)

Вот вывод в java с gson:

* * {Тысяча сорок-девять
«Первый параметр»: 0,
"secondObject": {
"myName": "это мое имя"
}
}
9 голосов
/ 29 сентября 2008

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

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

8 голосов
/ 30 сентября 2008

В зависимости от того, что именно вы хотите сделать, решение может быть довольно простым. Следующее не произведет форматированный вывод, предоставляемый 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());

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

7 голосов
/ 29 сентября 2008

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

2 голосов
/ 25 октября 2011

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

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

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

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

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

2 голосов
/ 29 сентября 2008

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

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

0 голосов
/ 29 сентября 2008

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

0 голосов
/ 29 сентября 2008

Нет эквивалента для print_r в Java.

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

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

// print each list element 

for (String s : list) {

   System.out.println(s);

 }
0 голосов
/ 29 сентября 2008

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

Но ...

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...