打印阵列图

时间:2012-10-11 08:58:35

标签: java arrays string map

我要做的是使用几种对象记录复杂的HashMap<String, Object>,我事先并不知道结构。只有Map's own toString method is that when it runs in to arrays and their own toString`方法的问题,输出才能提供信息:

{array=[Ljava.lang.Object;@6c22c95b}

我可以通过哪种方式实现记录Map的最佳方式?

示例代码段:

public static void main(String[] args) {
    final Map<String, Object> map = new HashMap<String, Object>();
    final Object[] array = new Object[] {"hep", 1, true};
    map.put("array", array);
    System.out.println(map);
}

输出:

{array=[Ljava.lang.Object;@6c22c95b}

7 个答案:

答案 0 :(得分:2)

你有两种可能性。

首先更改地图以包含集合而不是数组。 toString()的{​​{1}}方法使用AbstractCollection元素本身创建了集合元素的精美视图,因此,如果元素的toString足够好,则总视图也可以读取

其他可能性是迭代映射条目并使用toString创建数组的字符串表示形式。通常记录器足够灵活,可以轻松地开箱即用,例如使用log4j的格式化程序。

答案 1 :(得分:0)

你需要迭代并打印数组的内容,如

 java.util.Arrays.toString(array);

答案 2 :(得分:0)

这实际上是Java的一个黑暗角落。

您可以使用提供Apache Commons Lang的外部库ReflectionToStringBuilder

答案 3 :(得分:0)

那么你可以定义你自己的地图,扩展法线贴图并遮盖.toString() 然后依次检查对象是否为数组的实例,并以不同的方式处理打印。

答案 4 :(得分:0)

除非值Object正确覆盖它的toString方法,否则只能通过打印Object来打印有意义的日志。但是有可能使用Java反射。使用java.lang.reflect,您必须获取字段(仅适用于公共字段)及其值。如果字段提到的对象不是覆盖toString方法,则需要再次使用反射。

Object object = map.get(key);
Class<?> klass = object.getClass(); // but it supports only public fields
Fields[] fields = klaa.getFields();

for (Field field: fields) {
 // get the values from the field . Check with the API
}

如果字段是私有字段,并且如果您确定可以使用getter方法,则可以使用反射调用它们并打印它们。

答案 5 :(得分:0)

你正在解决错误的问题。使用Guava Multimap而不是数组映射,一切都会更好,包括字符串表示。如果您不想使用外部库,请使用Map<String, List<Object>>。所有标准List实现都提供了正确的toString()方法。

BTW,混合阵列通常是代码气味。您应该尝试创建数组内容的Object表示。

答案 6 :(得分:0)

这里有一些可能有效的简单实用方法。

public static String toString(Object[] array) {
    if (array == null) return "null";
    final StringBuilder b = new StringBuilder("[");
    for (Object o : array) {
        if (b.length() > 0) b.append(", ");
        if (o == null) {
            b.append("null");
        } else if (o instanceof Map) {
            b.append(toString((Map) o));
        } else if (o.getClass().isArray()) {
            b.append(toString((Object[]) o));
        } else {
            b.append(o.toString());
        }
    }
    return b.append("]").toString();
}

public static String toString(Map map) {
    if (map == null) return "null";
    final StringBuilder b = new StringBuilder("{");
    for (Object key : map.keySet()) {
        final Object value = map.get(key);
        b.append(key).append("=");
        if (value == null) {
            b.append("null");
        } else {
            if (value.getClass().isArray()) {
                b.append(toString((Object[]) value, ", "));
            } else if (value instanceof Map) {
                b.append(toString((Map) value));
            } else {
                b.append(value);
            }
        }
    }
    return b.append("}").toString();
}

这些改编自cobbzilla-utils,我个人的便利实用程序库: