有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何解析这个矩阵?

为了好玩,我决定编写一个Python程序,在不使用NumPy库的情况下对矩阵(数字数据的矩形集合)执行数学运算,但它是专门用于矩阵数学(线性代数)的。我已经用Python完成了这个程序,但从那时起,我决定尝试将其转换为Java代码。由于Python不像Java那样严格类型化,所以我目前的问题是以x x x, x x x, x x x, ...的形式解析用户的字符串矩阵输入,其中每个数字由一个空格分隔,每行由一个逗号和一个空格分隔。我必须把它解析成[[x, x, x], [x, x, x], [x, x, x], [...]]

我创建了一个单独的函数,它将返回double[][] matrix并接收用户输入,但为了测试,我将其返回类型保留为void,并以"1 2 3, 4 5 6, 7 8 9"的形式给它一个默认的[[1, 2, 3], [4, 5, 6], [7, 8, 9]]矩阵

// Takes text input; transforms it into array of arrays (matrix)
// parse 'x x x, x x x, ...' into [[x, x, x], [x, x, x], [...]]
private static void parseMatrix(String matrix) {
    // Separates each row (one array results)
    String[] partMat = matrix.strip().split(", ");
    // Supposed to create arrays out of rows (multiple arrays result)
    for (int i = 0; i < partMat.length; i++) {
        partMat[i].split(" ");
        System.out.println(Arrays.toString(partMat));
    }
}

public static void main(String[] args) {
    parseMatrix("1 2 3, 4 5 6, 7 8 9");
}

在这个测试代码中,我希望它打印[[1, 2, 3], [4, 5, 6], [7, 8, 9]]3次,但它打印[1 2 3, 4 5 6, 7 8 9]3次。我错过了什么


共 (3) 个答案

  1. # 1 楼答案

    如果你对双[]满意,一行是可能的

    private static Double[][] parseMatrix(String matrix) {
        return Stream.of(matrix.split(", "))
                .map(row -> Stream.of(row.split(" ")).map(Double::valueOf).toArray(Double[]::new))
                .toArray(Double[][]::new);
    }
    

    它基本上是一种csv格式,所以commons csv也可以进行解析工作,但有一些难看的调整:

    List<CSVRecord> rows = CSVFormat.DEFAULT.withDelimiter(' ')
                .parse(new StringReader(matrix.replace(", ", "\n")))
                .getRecords();
    

    有些人认为,所有这些对象、拆分、流和库的东西都是非常蹩脚的,完全以第一人称模式创建这个功能更酷,非常低级的老式学校、扫描仪、解析器等等,而不是仅使用char[]这一古老的苦行传统。它的Possible,这样也可以将LoC增加70倍,而不引入不必要的代码,嗯。。。不多,单元测试不算在内

  2. # 2 楼答案

    aString.split(" ")调用返回一个结果数组,您将忽略它,但不会修改原始数组。您需要使用其结果将新解析的行存储到某个位置:

    private static double[][] parseMatrix(String matrix) {
        String[] partMat = matrix.strip().split(", ");
        double[][] rows = new double[partMat.length][];
        for(int i = 0; i < partMat.length; i++) { 
            String[] row = partMat[i].split(" ");  // <  store result
            System.out.println(Arrays.toString(row));
            // will fail unless you use Double.valueOf to parse each element
            // rows[i] = row;
        }
        return rows;
    }
    
  3. # 3 楼答案

    您的输出是2D数组,因此解析应该这样做

    private static double[][] parseMatrix(String matrix) {
        String[] parentMat = matrix.split(", ");
        double[][] childMat = new double[parentMat.length][];
        for (int i = 0; i < parentMat.length; i++) {
            String[] child = parentMat[i].split(" ");
            childMat[i] = new double[child.length];
            for (int j = 0; j < child.length; j++) {
                childMat[i][j] = Double.parseDouble(child[j]);
            }
        }
        System.out.print(Arrays.deepToString(childMat));
        //[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]
    
        return childMat;
    }