【问题标题】:Printing a matrix from a string array从字符串数组打印矩阵
【发布时间】:2021-03-08 17:31:13
【问题描述】:

我有一个字符串二维数组,我需要将其格式化为一个矩阵。我需要的是这样的:

   1  3  4
-124 52  6

 1  2  3  4
 5  6  7  8
-9 -8 -7 -6

  2   3   4   5
  7   8   9  10
-12 -11 -10  -9

我必须考虑矩阵中最长的线,以便矩阵的其他线与它对齐。我已经编写了代码来确定哪一行最长,因为它将以此为基础,但我不知道格式化它的确切方法。

这是我在将整数矩阵转换为字符串时确定最长行的长度的代码:

String[][] solution = new String[m][n];
int l = 0;
for (int j = 0; j < m; j++) {
    int temp = 0;
    for (int k = 0; k < n; k++) {
        solution[j][k] = Integer.toString(matrix[j][k]);
        temp += solution[j][k].length();
    }
    if (l < temp) l = temp;
}

【问题讨论】:

    标签: java matrix


    【解决方案1】:

    我假设“看起来像一个矩阵”,您的意思是矩阵元素之间的等距间距。

    这是我想出来的。

        1    3    4
     -124   52    6
    
      1  2  3  4
      5  6  7  8
     -9 -8 -7 -6
    
       2   3   4   5
       7   8   9  10
     -12 -11 -10  -9
    

    “诀窍”是找到需要打印最多字符的元素,并使用该长度加一来获取行上单元格之间的间距。

    String 类有一个format 方法,可以将int 格式化为String。格式化程序 "%4d" 将采用 int 并使其成为带有前导空格的四个字符 String

    我们可以通过将格式化程序的三个部分放在一起来构造一个格式化程序。

    String formatter = "%" + width + "d";
    

    这是完整的可运行代码。

    public class MatrixPrint {
        public static void main(String[] args) {
            MatrixPrint mp = new MatrixPrint();
    
            int[][] matrix1 = {{1, 3, 4},
                    {-124, 52, 6}};
            System.out.println(mp.printMatrix(matrix1));
    
            int[][] matrix2 = {{1, 2, 3, 4},
                    {5, 6, 7, 8},
                    {-9, -8, -7, -6}};
            System.out.println(mp.printMatrix(matrix2));
    
            int[][] matrix3 = {{2, 3, 4, 5},
                    {7, 8, 9, 10},
                    {-12, -11, -10, -9}};
            System.out.println(mp.printMatrix(matrix3));
        }
    
        public String printMatrix(int[][] matrix) {
            int width = largestWidth(matrix) + 1;
            String formatter = "%" + width + "d";
            return printMatrixElements(matrix, formatter);
        }
    
        private int largestWidth(int[][] matrix) {
            int maxWidth = 0;
            for (int i = 0; i < matrix.length; i++) {
                for (int j = 0; j < matrix[i].length; j++) {
                    int width = Integer.toString(matrix[i][j]).length();
                    maxWidth = Math.max(maxWidth, width);
                }
            }
            return maxWidth;
        }
    
        private String printMatrixElements(int[][] matrix, String formatter) {
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < matrix.length; i++) {
                for (int j = 0; j < matrix[i].length; j++) {
                    builder.append(String.format(formatter, matrix[i][j]));
                }
                builder.append(System.lineSeparator());
            }
            return builder.toString();
        }
    }
    

    【讨论】:

    • 虽然这几乎是完美的,但它在每行的开头放置了不需要的空格。我通过使用两种不同的格式化程序来解决这个问题。
    【解决方案2】:

    所以让我们假设您的数组存储为数组[r][c]。所以你想要做的是遍历列和行。在一个非常简单的基础上,您可以这样做:

    if(c>r){构建一个嵌套循环,row是外循环}

    如果是 r>c,则反之。希望对您有所帮助

    【讨论】:

    • 这不是问题。我的问题是如何排列它们。
    • 你的意思是重新排列它们吗?就像它是一个 10x5 数组,你希望它是 5x10?
    • 也不是这样,但如果您有兴趣,有一个答案可以完全回答我的问题。
    【解决方案3】:

    您可以使用String.format 方法并将每个数字表示为一定长度的字符串,包括负数的连字符。例如,如果号码已经是String格式,则可以使用:

    // format as a three-character string
    String str = String.format("%3s", "-11");
    

    如果你有一个这样的字符串数组,你应该事先知道最小的负数或最大的正数,即最长的字符串。您的代码可能如下所示:

    public static void main(String[] args) {
        printArray(new String[][]{
                {"1", "3", "4"},
                {"-124", "52", "6"}}, 4);
        printArray(new String[][]{
                {"1", "2", "3", "4"},
                {"5", "6", "7", "8"},
                {"-9", "-8", "-7", "-6"}}, 2);
        printArray(new String[][]{
                {"2", "3", "4", "5"},
                {"7", "8", "9", "10"},
                {"-12", "-11", "-10", "-9"}}, 3);
    }
    
    public static void printArray(String[][] arr, int length) {
        Arrays.stream(arr)
                .map(row -> Arrays.stream(row)
                        .map(str -> String.format("%" + length + "s", str))
                        .collect(Collectors.joining(" ")))
                .forEach(System.out::println);
    }
    

    输出:

       1    3    4
    -124   52    6
    
     1  2  3  4
     5  6  7  8
    -9 -8 -7 -6
    
      2   3   4   5
      7   8   9  10
    -12 -11 -10  -9
    

    另见:
    Pascal's triangle 2d array - formatting printed output
    How to get the following formatted output?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2021-07-24
      • 2015-04-10
      • 2014-05-05
      相关资源
      最近更新 更多