如何在Java中打印指向数组的对象

如何在Java中打印指向数组的对象,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我有一张地图,定义如下 HashMap<Object, Object> hashMap; 我实际上是在复制Arrays.deepToString()的功能。但是我找不到一种只使用Arrays.toString()或Arrays.deepToString()的方法 这是解决问题的正确方法,还是有什么办法让这些标准方法对我有效 任何帮助都会很好。如果您将数组转换为列表,然后使用toString呢- Arrays.asList(数组) 您需要以这种方式编写助手方法- private St

我有一张地图,定义如下

HashMap<Object, Object> hashMap;
我实际上是在复制
Arrays.deepToString()
的功能。但是我找不到一种只使用
Arrays.toString()
Arrays.deepToString()的方法

这是解决问题的正确方法,还是有什么办法让这些标准方法对我有效


任何帮助都会很好。

如果您将数组转换为列表,然后使用toString呢-

Arrays.asList(数组)

您需要以这种方式编写助手方法-

private String convertToHumanReadableFormat(Object value) {
    if (value == null) return "N/A";
    if (value.getClass().isArray()) {
       value = Arrays.asList((Object[])value);     
    }     
    return value.toString(); 
} 

要处理原语,首先需要手动将数组转换为列表-

private String convertToHumanReadableFormat(Object value) {
    if (value == null) return "N/A";
    if (value.getClass().isArray()) {

       //convert array to list 
       int count = Array.getLength(value);
       ArrayList<Object> list = new ArrayList<Object>();
       for(int i=0; i<count; i++){
          list.add(Array.get(value, i));
       } 
       return list.toString(); //or value=list;  
    }     
    return value.toString(); 
}
私有字符串转换为HumanReadableFormat(对象值){
如果(value==null)返回“不适用”;
if(value.getClass().isArray()){
//将数组转换为列表
int count=Array.getLength(值);
ArrayList=新建ArrayList();

对于(inti=0;i来说,如果将数组转换为list,然后使用toString呢-

Arrays.asList(数组)

您需要以这种方式编写助手方法-

private String convertToHumanReadableFormat(Object value) {
    if (value == null) return "N/A";
    if (value.getClass().isArray()) {
       value = Arrays.asList((Object[])value);     
    }     
    return value.toString(); 
} 

要处理原语,首先需要手动将数组转换为列表-

private String convertToHumanReadableFormat(Object value) {
    if (value == null) return "N/A";
    if (value.getClass().isArray()) {

       //convert array to list 
       int count = Array.getLength(value);
       ArrayList<Object> list = new ArrayList<Object>();
       for(int i=0; i<count; i++){
          list.add(Array.get(value, i));
       } 
       return list.toString(); //or value=list;  
    }     
    return value.toString(); 
}
私有字符串转换为HumanReadableFormat(对象值){
如果(value==null)返回“不适用”;
if(value.getClass().isArray()){
//将数组转换为列表
int count=Array.getLength(值);
ArrayList=新建ArrayList();

对于(int i=0;i)有几种方法可以考虑——
答:如果您对格式不太严格,只想以人类可读的方式打印HashMap内容,我建议您使用JSon序列化-如果输出是人类可读的话。
您可以看到我们在开源项目(克隆引擎项目的git repo)中所做的事-engine\backend\manager\modules\utils\src\main\java\org\ovirt\engine\core\utils\serialization\json-查看那里的JsonObjectSerializer类。

B.如果对格式要求严格,则应获取地图的入口集,对其进行迭代,并将对象插入ArrayList。然后,可以使用toArray()方法返回数组,并使用上述方法。

请注意,我建议您的ARAYLIST将是一个字符串数组,因此必须使用每个MaScript并将其转换为字符串,并考虑toString(),看看它产生的格式是否足够好。

< P> >您可以考虑几种方法-BR> 答:如果您对格式不太严格,只想以人类可读的方式打印HashMap内容,我建议您使用JSon序列化-如果输出是人类可读的话。
您可以看到我们在开源项目(克隆引擎项目的git repo)中所做的事-engine\backend\manager\modules\utils\src\main\java\org\ovirt\engine\core\utils\serialization\json-查看那里的JsonObjectSerializer类。

B.如果对格式要求严格,则应获取地图的入口集,对其进行迭代,并将对象插入ArrayList。然后,可以使用toArray()方法返回数组,并使用上述方法。

请注意,我建议您的ARAYLIST将是一个字符串数组,因此必须使用每个MaScript并将其转换为字符串,考虑toString()。看看它产生的格式是否适合您。

如果您的用例是以人类可读的形式呈现数组和其他对象图,那么您可以选择模板化解决方案(如freemarker的速度)或将其转换为JSON(或XML)和rpetty-pring-it,我建议使用GSON/XStream来完成此任务


如果您希望将其用于调试目的,那么只需坚持使用日志系统并使用那里可用的标准转换器(例如在log4j中)

如果您的用例是以人类可读的形式呈现数组和其他对象图,您可以使用模板解决方案(如freemarker的速度)或将其转换为JSON(或XML)我建议使用GSON/XStream来完成这项任务


如果您想将其用于调试目的,那么只需坚持使用日志系统,并使用那里可用的标准转换器(例如在log4j中)

请将方法
convertToHumanReadableFormat
修改为以下内容。我已经对其进行了测试,它确实起到了作用

private <T> String convertToHumanReadableFormat(Object value) {
            if (value == null) return "N/A";
            if (value.getClass().isArray()) {
                if( value instanceof int[]||value instanceof long[]){
                    List<T> list = new ArrayList<T>();
                    list.addAll((Collection<? extends T>) Arrays.asList(value));
                    return convertToHumanReadableFormat(list.toArray());

                }else{
                     return Arrays.deepToString((Object[]) value);
                }
            }
            return value.toString();
        }
私有字符串转换为HumanReadableFormat(对象值){
如果(value==null)返回“不适用”;
if(value.getClass().isArray()){
if(int[]的值instanceof | | long[]的值instanceof){
列表=新的ArrayList();

list.addAll((Collection请将方法
convertToHumanReadableFormat
修改为以下内容。我已经对它进行了测试,它确实有效

private <T> String convertToHumanReadableFormat(Object value) {
            if (value == null) return "N/A";
            if (value.getClass().isArray()) {
                if( value instanceof int[]||value instanceof long[]){
                    List<T> list = new ArrayList<T>();
                    list.addAll((Collection<? extends T>) Arrays.asList(value));
                    return convertToHumanReadableFormat(list.toArray());

                }else{
                     return Arrays.deepToString((Object[]) value);
                }
            }
            return value.toString();
        }
私有字符串转换为HumanReadableFormat(对象值){
如果(value==null)返回“不适用”;
if(value.getClass().isArray()){
if(int[]的值instanceof | | long[]的值instanceof){
列表=新的ArrayList();

list.addAll((Collection您可以使用九个instanceof语句来调用适当的toString或deepToString方法。如果您使用自己的代码,请记住使用StringBuilder,并考虑数组包含对自身或父维度的引用的可能性。当前,您的代码将递归,直到堆栈溢出。使用正如我建议的那样,instanceof还可以避免代码中固有的原始值装箱(从而提高性能)

if (val instanceof Object[]) return Arrays.deepToString((Object[]) val);
if (val instanceof byte[]) return Arrays.toString((byte[]) val);
// Repeat for other 7 array types...

您可以只使用九条instanceof语句来调用适当的toString或deepToString方法。如果您使用自己的代码,请记住使用StringBuilder,并考虑数组包含对自身或父维度的引用的可能性。当前,您的代码将