Печать массивов в Java - PullRequest
       36

Печать массивов в Java

7 голосов
/ 18 января 2012

Я пишу метод, который печатает каждый переданный объект. Это прекрасно работает, вызывая метод Object.toString() для объекта, но не работает для массивов. Я могу выяснить, является ли это массивом с методом Object.getClass().isArray(), но я не знаю, как его привести.

int[] a;
Integer[] b;

Object aObject = a;
Object bObject = b;

// this wouldn't work
System.out.println(Arrays.toString(aObject));
System.out.println(Arrays.toString(bObject));

Ответы [ 5 ]

12 голосов
/ 18 января 2012

Если вы не знаете тип, вы можете привести объект к Object[] и распечатать его следующим образом (убедившись, что это действительно массив и его можно привести к Object[]). Если это не экземпляр Object[], используйте отражение , чтобы сначала создать Object[], а затем вывести:

private void printAnyArray(Object aObject) {
    if (aObject.getClass().isArray()) {
        if (aObject instanceof Object[]) // can we cast to Object[]
            System.out.println(Arrays.toString((Object[]) aObject));
        else {  // we can't cast to Object[] - case of primitive arrays
            int length = Array.getLength(aObject);
            Object[] objArr = new Object[length];
            for (int i=0; i<length; i++)
                objArr[i] =  Array.get(aObject, i);
            System.out.println(Arrays.toString(objArr));
        }
    }
}

ИСПЫТАНИЯ:

printAnyArray(new int[]{1, 4, 9, 16, 25});
printAnyArray(new String[]{"foo", "bar", "baz"});

ВЫВОД:

[1, 4, 9, 16, 25]
[foo, bar, baz]
1 голос
/ 19 января 2012

Почему бы вам не позволить перегрузке метода решить вашу проблему?Просто напишите два (или более) метода с одинаковыми именами, но разными сигнатурами, а затем дайте компилятору решить, какой метод будет вызван при выполнении программы:

void print(Object object) {
   System.out.println("Object: " + object);
}

void print(Object[] array) {
    System.out.println("Object[]: " Arrays.toString(array)); 
}

void print(int[] array) {
    System.out.println("int[]: " Arrays.toString(array)); 
}

Пример использования в другом месте кода:

String first = "test";
print(first);   // prints "Object: test";

String[] second = {"A", "B"};    
print(second);   // prints "Object[]: [A, B]" 

int[] third = {1, 2};
print(third);    // prints "int[]: [1, 2]"
1 голос
/ 18 января 2012

Если вы спрашиваете, как можно вызвать этот метод программно для любого массива, это не будет возможно с примитивными массивами. Посмотрев документы для класса Arrays, вы увидите, что существует перегрузка toString() для каждого типа примитивного массива.

Это потому, что, например, int[] расширяет Object, а не Object[].

РЕДАКТИРОВАТЬ: вот прискорбно длинное решение для включения примитивных массивов:

public static void printObject(Object obj) {

    String output;

    if (obj == null) {
        output = "null";
    }
    else if (obj.getClass().isArray()) {

        if (obj instanceof Object[]) {
            output = Arrays.toString((Object[])obj); //Object[] overload
        }
        else if (obj instanceof int[]) {
            output = Arrays.toString((int[])obj);    //int[] overload
        }
        //and so on for every primitive type
    }
    else {
        output = obj.toString();
    }

    System.out.println(output);
}

Я надеюсь, что кто-то другой может предложить более элегантное решение, но, исходя из ограничений примитивных массивов, это может быть лучшим, что вы можете сделать.

0 голосов
/ 19 января 2012

Вам нужно использовать отражение, чтобы добраться до более глубокой структуры Object, если вы не хотите полагаться на сам класс объекта, чтобы перегружать метод Object toString (чтобы получить что-то более полезное, чем печать имени класса и хеш-кода ..) .)

Я предлагаю использовать библиотеку, которая использует отражение, чтобы перейти к более глубокой структуре, например GSON: http://code.google.com/p/google-gson/

public static String print(Object object) {
    return new Gson().toJson(object);
}

public static void test() {
    System.out.println(print(new int[][] {new  int[] {1, 2, 3} }));
    // outputs: [[1,2,3]]
    System.out.println(print(new String[] { "aa", "bb", "cc" }));
    // outputs: ["aa","bb","cc"]
}

Это печатает массивы без особых усилий, включая многомерные массивы и примитивные массивы.

Но реальное преимущество заключается в том, что он печатает объекты любого класса единообразным образом, независимо от того, был ли класс переопределен toString любым полезным способом или нет.

0 голосов
/ 18 января 2012

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

...