【问题标题】:How do I print an array that has been converted to object?如何打印已转换为对象的数组?
【发布时间】:2015-01-08 08:47:40
【问题描述】:

我有一个接受对象作为输入的记录器,这对我来说相当方便。但是现在我必须记录一个int[] 类型的输入。我想修改方法,以便正确记录任何数组或 Iterable。

在c#中,我会这样做:

int[]data=new int[10];
object tmp=data;

.....

if (tmp is IEnumerable)
{
     StringBuilder _tmp = new StringBuilder();
     foreach (var i in (IEnumerable)tmp)
     {
         if (_tmp.Length > 0)
         {
             _tmp.Append(",");
         }
         _tmp.Append(i);
     }
     var r = _tmp.ToString(); 
 }

我尝试检查 int[]Iterable(不是),然后尝试检查 tmp.getClass().isArray(),这有效,但现在我无法枚举该数组的成员。我需要一种适用于任何数组或对象列表的方法。

如何在 Java 中正确执行此操作?

【问题讨论】:

  • 试试tmp.getClass().getComponentType()
  • 为什么要删除类型信息?
  • @ElliottFrisch logger 方法看起来像Log(Object... arguments),我觉得这个用起来真的很方便

标签: java arrays logging iterable


【解决方案1】:

在 Java (*) 中可能没有干净的方法可以做到这一点。我认为这会奏效:

Object tmp = ...;

String s;
if (tmp instanceof boolean[]) {
    s = Arrays.toString((boolean[]) tmp);
}
else if (tmp instanceof byte[]) {
    s = Arrays.toString((byte[]) tmp);
}
else ...

char[]double[]float[]int[]long[]short[] 执行相同的操作;如果isArray()true 并且不是上述任何一种情况,

s = Arrays.toString((Object[]) tmp);

编辑:我已经对此进行了测试,并且可以正常工作。

有关可用的Arrays.toString 方法列表,请参阅this javadoc

(*) 好的,在另一个答案中使用Array.get 可能是一种更清洁的方法。我已经测试过了,它也可以工作。

【讨论】:

    【解决方案2】:

    你可以使用java.lang.reflect.Array中的方法

    Object obj = new int[] { 1, 2, 3, 4 };
    try {
        int len = Array.getLength(obj);
        for (int i = 0; i < len; i++) {
            if (i != 0) {
                System.out.print(", ");
            }
            System.out.print(Array.get(obj, i));
        }
        System.out.println();
    } catch (IllegalArgumentException iae) {
        iae.printStackTrace();
    }
    

    输出是

    1、2、3、4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 2018-02-13
      • 2016-09-07
      相关资源
      最近更新 更多