Java:打印?
上次我问如何填充数据结构。现在我想知道Java中是否有一些东西,比如我在PHP中使用的,来表示我在地图和列表中填充的内容,而不必做我自己的算法Java:打印?,java,data-structures,Java,Data Structures,上次我问如何填充数据结构。现在我想知道Java中是否有一些东西,比如我在PHP中使用的,来表示我在地图和列表中填充的内容,而不必做我自己的算法 有什么想法吗?调用集合上的toString应该返回一个包含所有元素字符串表示的字符串 不过,这对内置阵列不起作用,因为它们没有toString覆盖,只会给您一个内存地址。我不知道java中有什么与print\r等效的东西 但是 每个对象都有一个toString()方法的默认实现,如果您为它们调用toString(),列表和映射实现将打印它们的内容 如果您
有什么想法吗?调用集合上的toString应该返回一个包含所有元素字符串表示的字符串
不过,这对内置阵列不起作用,因为它们没有toString覆盖,只会给您一个内存地址。我不知道java中有什么与print\r等效的东西 但是 每个对象都有一个toString()方法的默认实现,如果您为它们调用toString(),列表和映射实现将打印它们的内容
如果您需要打印任何调试信息,toString()可能就是您要找的地方。您可以尝试使用好的Apache Commons Lang。Java中没有与打印相同的工具 但对于贴图或列表,您可以像这样使用foreach循环:
List <String> list = …; // fills your list
// print each list element
for (String s : list) {
System.out.println(s);
}
列表=…;//填写您的列表
//打印每个列表元素
用于(字符串s:列表){
系统输出打印项次;
}
对于数组,最简单的方法是arrays.asList(array).toString()。
我通常在我喜欢在调试输出中使用的对象上实现toString()。对于生成的对象(JAXB等),可能需要创建一个实用程序类来打印它。其他人提到了
toString()
方法。这只有在对象实现toString()
时才真正有用。如果没有正确地实现它,您将得到如下结果:java.lang。Object@1b9240e
即使有点繁琐,在您自己的类中实现
toString()
仍然很容易,但第三方类并不总是实现它。您最好使用调试器。PHP中存在像print\r
这样的东西的唯一原因是缺少真正的调试器。我想您会发现,能够设置断点而不是使用一堆诊断打印语句将导致更快的工作流和更干净的代码。根据您想要做的事情,解决方案可能相当简单。以下内容不会生成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());
//输出一个列表
最终列表=新的ArrayList();
列表。添加(“一”);
列表。添加(“两个”);
列表。添加(“三”);
列表。添加(“四”);
系统输出打印项次(列表);
//输出一个数组
最后一个字符串[]数组={“四”,“三”,“二”,“一”};
System.out.println(Arrays.asList(array));
//输出地图
final Map=new HashMap();
地图放置(“一”、“价值”);
地图放置(“两个”、“值”);
地图放置(“三”、“价值”);
System.out.println(map.entrySet());
对于其他类型的对象,您可以使用它们来创建一个用于此目的的对象。java中的toString()和PHP中的print\r()之间确实存在差异。 请注意,php中还有_toString(),它相当于java中的toString(),因此这并不是真正的答案 当我们有一个对象的结构,并且我们喜欢快速查看对象及其值的完整图形时,使用print_r 在java中为每个对象实现toString没有能力与print\r进行比较 而是使用gson。它的作用与打印相同 Gson Gson=new GsonBuilder().setPrettyPrinting().create()
System.out.println(gson.toJson(someObject)) 通过这种方式,您不需要为需要测试它的每个对象实现toString 以下是文件: 演示类(java): 公共A类{
int firstParameter = 0;
B secondObject = new B();
}
公共B类{
String myName = "this is my name";
}
以下是带有print\r的php输出:
对象(
[firstParameter:private]=>0
[secondObject:private]=>B对象
(
[myName:private]=>这是我的名字
) ) 以下是使用gson的java输出: {
“firstParameter”:0,
“第二个对象”:{
“我的名字”:“这是我的名字”
}
}
我对Java
print\r
类功能的理解是我编写的类。
它并不完美,但对我来说效果很好。用法是:
String output = RecursiveDump.dump(...);
在我了解泛型之前,我在很多年前就写过,它可以通过泛型来改进。此外,当它尝试处理某些集合类型时,对于对象,它将只调用toString()
方法
我曾想使用反射来提取类的字段名,但没有正确的toString()
,但既然可以为您编写toString()
方法
当然,另一种方法是使用调试器的inspector工具,但有时使用打印会更快。您也可以使用迭代器。。列表=。。。;迭代器;迭代器=list.iterator();虽然(iterator.hasNext()){System.out.println(iterator.next()+“,”);}java中的foreach循环的语法(无论如何,依我看)比迭代器干净得多,而且我相信它在表面下使用迭代器。在java 1.5中,您可以使用array.toString(array)代替。hi mate:)是的,我想要像print_r这样的东西,因为我没有想过使用调试器,因为正如你所说,我从来没有在PHP中使用过调试器。我将看看如何将调试器与Java一起使用!:)当与调试器一起使用时,一组合适的日志记录是非常宝贵的,因为它允许您比使用调试器更快地跟踪到某个函数。日志记录在生产模式代码中也很有用,因为它通常是问题的唯一记录。我在自定义类上尝试了这一点,它输出
ClassName@
。在自定义类上使用什么?@trusktr对于自定义类,必须重写toString()
方法,使其返回所需的内容