Как красиво распечатать 3D-массив в Java - PullRequest
0 голосов
/ 21 октября 2019

У меня есть трехмерный массив int, и я хотел бы распечатать его в следующем формате:

[n,n,n] [n,n,n] [n,n,n]
[n,n,n] [n,n,n] [n,n,n]
[n,n,n] [n,n,n] [n,n,n]

[n,n,n] [n,n,n] [n,n,n]
[n,n,n] [n,n,n] [n,n,n]
[n,n,n] [n,n,n] [n,n,n]

[n,n,n] [n,n,n] [n,n,n]
[n,n,n] [n,n,n] [n,n,n]
[n,n,n] [n,n,n] [n,n,n]

Я попытался использовать приведенный ниже код, но он не распечатался правильно, потому что второй итретьи столбцы должны быть добавлены к той же строке, что и первый столбец:

int[][][] hardestOne = {
    {{8, 0, 0, 0, 0, 3, 0, 7, 0}, {0, 0, 0, 6, 0, 0, 0, 9, 0}, {0, 0, 0, 0, 0, 0, 2, 0, 0}},
    {{0, 5, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 7, 0, 4, 5, 1, 0, 0}, {0, 0, 0, 7, 0, 0, 0, 3, 0}},
    {{0, 0, 1, 0, 0, 8, 0, 9, 0}, {0, 0, 0, 5, 0, 0, 0, 0, 0}, {0, 6, 8, 0, 1, 0, 4, 0, 0}}
};

public String toString() {
    String s = "";

    for (int i = 0; i < table.length; i++) {
        for (int j = 0; j < table[i].length; j++) {
            for (int k = 0; k < table[i][j].length; k++) {
                if (k == 2 || k == 5) {
                    s += table[i][j][k] + "\n";
                } else {
                    s += table[i][j][k] + "";
                }
            }
            s += "\n\n";
        }
        s += "\n";
    }

    return s;
}

ОБНОВЛЕНИЕ: Я изменил пример массива, чтобы сделать его более читабельным.

ОБНОВЛЕНИЕ 2: Пользователь @samurott дал действительно хороший ответ, но есть проблема:

Рассмотрим эти три строки, которые представляют первый блок в моем массиве

{{8, 0, 0}, {0, 0, 3}, {0, 7, 0}},
{{0, 0, 0}, {6, 0, 0}, {0, 9, 0}},
{{0, 0, 0}, {0, 0, 0}, {2, 0, 0}}

Просмотрэти строки над печатью должны выглядеть следующим образом

[8,0,0] [0,0,0] [0,0,0]
[0,0,3] [6,0,0] [0,0,0]
[0,7,0] [0,9,0] [2,0,0]

Но когда я печатаю его, используя его код, это выглядит так

[8,0,0] [0,0,3] [0,7,0]
[0,0,0] [6,0,0] [0,9,0]
[0,0,0] [0,0,0] [2,0,0]

Вы видите, что я могу изменить все позиции массивано это будет становиться все более и более запутанным позже.

РЕШЕНИЕ: См. решение ниже, сделанное пользователем @ Alex R

Ответы [ 3 ]

3 голосов
/ 21 октября 2019

Здесь будет многоразовое решение для матриц 3х3. Это работает, только если массив содержит числа от 0 до 9. Дополнительное форматирование необходимо, если вы хотите поддерживать и другие целые числа.

public final class TableFormatter {
private static final int[][][] TABLE = {
        {{8, 0, 0, 0, 0, 3, 0, 7, 0}, {0, 0, 0, 6, 0, 0, 0, 9, 0}, {0, 0, 0, 0, 0, 0, 2, 0, 0}},
        {{0, 5, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 7, 0, 4, 5, 1, 0, 0}, {0, 0, 0, 7, 0, 0, 0, 3, 0}},
        {{0, 0, 1, 0, 0, 8, 0, 9, 0}, {0, 0, 0, 5, 0, 0, 0, 0, 0}, {0, 6, 8, 0, 1, 0, 4, 0, 0}}
};

public static void main(String[] args) {
    TableFormatter formatter = new TableFormatter(TABLE);
    System.out.println(formatter.toString());
}

private final int[][][] array3d;

public TableFormatter(int[][][] array3d) {
    this.array3d = array3d;
}

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    for (int[][] array2d : array3d) {
        append2dArray(builder, array2d);
        builder.append('\n');
    }
    return builder.toString();
}

private void append2dArray(StringBuilder builder3d, int[][] array2d) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            StringBuilder builder2d = new StringBuilder("[");
            for (int k = 0; k < 3; k++) {
                builder2d.append(array2d[j][(i * 3) + k]).append(',');
            }
            builder2d.deleteCharAt(builder2d.length() - 1).append("]\t");
            builder3d.append(builder2d);
        }
        builder3d.append('\n');
    }
}
}

Вывод:

[8,0,0] [0,0,0] [0,0,0] 
[0,0,3] [6,0,0] [0,0,0] 
[0,7,0] [0,9,0] [2,0,0] 

[0,5,0] [0,0,7] [0,0,0] 
[0,0,0] [0,4,5] [7,0,0] 
[0,0,0] [1,0,0] [0,3,0] 

[0,0,1] [0,0,0] [0,6,8] 
[0,0,8] [5,0,0] [0,1,0] 
[0,9,0] [0,0,0] [4,0,0] 

Если вам нужна поддержка общих матриц, вам придется передать измерение в качестве аргумента конструктору и обновить переменные цикла, чтобы они использовали это измерение.

1 голос
/ 21 октября 2019

Я считаю, что вы пытаетесь напечатать 4-мерный массив, а не 3-мерный, так как у вас есть 4 слоя группировки. Однако вот модифицированный цикл pretty-print:

for (int i = 0; i < table.length; i++){
    for (int j = 0; j < table[i].length; j++){
        for (int k = 0; k < table[i][j].length; k++){
            s += "[";
            for (int l = 0; l < table[i][j][k].length; l++){
                s += table[i][j][k][l];
                if (l != table[i][j][k].length - 1){
                    s += ",";
                }
            }
            s += "]";
            if (k != table[i][j].length - 1){
                s += " ";
            }
        }
        s += "\n";
    }
    s += "\n";
}

Это таблица измененных значений, которую я использую:

static int[][][][] table = {
        {
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
        },
        {
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
        },
        {
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},
                {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
        },
};
0 голосов
/ 21 октября 2019

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

public class X {

    int[][][] table = {
        {{1, 2, 3, 4, 5, 6, 7, 8, 9}, {11, 12, 13, 14, 15, 16, 17, 18, 19}, {21, 22, 23, 24, 25, 26, 27, 28, 29}},
        {{101, 102, 103, 104, 105, 106, 107, 108, 109}, {111, 112, 113, 114, 115, 116, 117, 118, 119}, {121, 122, 123, 124, 125, 126, 127, 128, 129}},
        {{201, 202, 203, 204, 205, 206, 207, 208, 209}, {211, 212, 213, 214, 215, 216, 217, 218, 219}, {221, 222, 223, 224, 225, 226, 227, 228, 229}},
    };

    public String toString() {
        String s = "";

        for (int i = 0; i < table.length; i++) {
            for (int j = 0; j < table[i].length; j++) {
                s += (j == 0) ? "[" : " [";


                for (int k = 0; k < table[i][j].length; k++) {
                    if (k > 0) {
                        s += ", ";
                    }
                    s += table[i][j][k];
                }
                s += "]";
            }
            s += "\n";
        }

        return s;
    }

    public static void main(String[] args) {
        X foo = new X();
        System.out.println(foo.toString() );
    }
}

$ javac X.java && java X
[1, 2, 3, 4, 5, 6, 7, 8, 9] [11, 12, 13, 14, 15, 16, 17, 18, 19] [21, 22, 23, 24, 25, 26, 27, 28, 29]
[101, 102, 103, 104, 105, 106, 107, 108, 109] [111, 112, 113, 114, 115, 116, 117, 118, 119] [121, 122, 123, 124, 125, 126, 127, 128, 129]
[201, 202, 203, 204, 205, 206, 207, 208, 209] [211, 212, 213, 214, 215, 216, 217, 218, 219] [221, 222, 223, 224, 225, 226, 227, 228, 229]
...