import java.util.Arrays;


public class MatrixTransposition {
    
    public static int[][] transpose(int[][] matrix) {
        assert isRectangular(matrix) : "Matrix nicht rechteckig";
        if (matrix.length == 0 || matrix[0].length == 0) {
            return new int[0][];
        }
        int[][] result = new int[matrix[0].length][];
        for(int i=0; i < result.length; i++) {
            result[i] = new int[matrix.length];
        }
        for(int i=0; i < matrix.length; i++) {
            for(int j=0; j < matrix[i].length; j++) {
                result[j][i] = matrix[i][j];
            }
        }
        return result;
    }
    
    private static boolean isRectangular(int[][] matrix) {
        if (matrix.length == 0) {
            return true;
        }
        // Jetzt gibt es auf jeden Fall einen Index 0 in matrix
        for(int i=1; i < matrix.length; i++) {
            if (matrix[i].length != matrix[0].length) {
                return false;
            }
        }
        return true;
    }
    
    /**
     * Kurzversion, die vollkommen genügt.
     */
    public static void printMatrix(int[][] matrix) {
        for(int[] row : matrix) {
            System.out.println(Arrays.toString(row));
        }
    }

    /**
     * Luxusvariante, motiviert durchs Forum.
     */
    public static void printMatrix2(int[][] matrix) {
        // Funktioniert nur, wenn man vorher überprüft hat, dass die Matrix wirklich rechteckig ist
        String formatStr = computeFormatString(matrix);
        for(int[] row : matrix) {
            System.out.print("| ");
            for(int i=0; i < row.length; i++) {
                if (i > 0) System.out.print(", ");
                System.out.format(formatStr, row[i]);
            }
            System.out.println(" |");
        }
    }

    private static String computeFormatString(int[][] matrix) {
        int max = 1;
        for(int[] row : matrix) {
            for (int value : row) {
                max = Math.max(max, Integer.toString(value).length());
            }
        }
        String formatStr = "%"+max+"d";
        return formatStr;
    }

    public static void main(String[] args) {
        int[][] matrix = {{1,2,3333},{4,5,6}};
        printMatrix2(matrix);
        printMatrix2(transpose(matrix));
    }
}
