Java 是否可以从一个文件创建两个不同大小的数组/矩阵?

Java 是否可以从一个文件创建两个不同大小的数组/矩阵?,java,matrix,multidimensional-array,Java,Matrix,Multidimensional Array,基本上,我尝试从一个文本文件创建两个不同大小的2D数组,如下所示: 2 add 3 4 2 1 7 -10 0 5 -3 12 1 7 -2 -5 0 1 2 3 4 5 6 7 8 9 0 1 subtract 2 2 2 12 10 0 4 6 9 1 2是问题数(加法和减法),3和4是行数和列数,下面的数字是填充到2D数组中的两个独立矩阵。如果我就到此为止,该程序将正常工作: class Matrices { private Scanner fileReader; private in

基本上,我尝试从一个文本文件创建两个不同大小的2D数组,如下所示:

2
add
3 4
2 1 7 -10
0 5 -3 12
1 7 -2 -5
0 1 2 3
4 5 6 7
8 9 0 1
subtract
2 2
2 12
10 0
4 6 
9 1
2
是问题数(加法和减法),
3
4
是行数和列数,下面的数字是填充到2D数组中的两个独立矩阵。如果我就到此为止,该程序将正常工作:

class Matrices {
private Scanner fileReader;
private int rows;
private int columns;
int problems;
String method;

public Matrices(String file) throws FileNotFoundException {
    this.fileReader = new Scanner(new FileInputStream(file));
    problems = fileReader.nextInt();
    method = fileReader.next();

    if(method.equals("add")) {
        rows = fileReader.nextInt();
        columns = fileReader.nextInt();
    }

}

public int[][] readMatrix() throws FileNotFoundException {
    int[][] result = new int[rows][columns];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            result[i][j] = fileReader.nextInt();
        }
    }
    return result;
}


public int[][] add(int[][] a, int[][] b) {
    int[][] result = new int[rows][columns];
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
               result[i][j] = a[i][j] + b[i][j];
           }
       }
       return result;
}

public void printMatrix(int[][] matrix) {
    for ( int[] anArray : matrix ) {
        for ( int anInt : anArray ) {
            System.out.print(anInt+ " ");
        }
        System.out.println();
    }
}
}
它创建和打印矩阵非常好,没有任何问题。但是,每当我尝试创建和打印下两个矩阵(文本文件中下面的2x2数组减法)时,它都会返回以下错误:

Enter name of file: 
data/Matrices.txt
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at baker.Matrices.readMatrix(Matrices.java:27)
    at baker.MatricesDriver.main(MatricesDriver.java:15

我的问题是,我应该做哪些调整,以便程序识别出两个2D阵列为3x4,以下两个为2x2?

您试图构建数据结构

您可以使用:


对于创建没有固定大小的数组或向量使用arrayList,您可以从arrayList创建arrayList

我建议将实现分解为以下部分:

  • 矩阵
    -保存问题定义中一个矩阵的值
  • 问题
    -保存问题定义中的操作和两个矩阵
矩阵
类可以如下所示:

class Matrix {
    private int[][] values;

    public Matrix(int[][] values) {
        this.values = values;
    }

    public int[][] getValues() {
        return values;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Matrix [values=\n");
        for (int i = 0; i < values.length; i++) {
            sb.append("\t" +  Arrays.toString(values[i]) + "\n");
        }
        sb.append("]");
        return sb.toString();
    }
}
基于此,“驱动程序”类执行以下操作:

  • 从用户输入获取文件名
  • 从文件中读取问题的数量,并以此初始大小构建一个列表
  • 对于问题数量(即2),获取操作、行和列,并构造包含这些信息的新问题对象,并将问题放入列表中
  • 这里有一个简单的解决方案-这里还有改进的余地:-)

    import java.io.FileInputStream;
    导入java.io.FileNotFoundException;
    导入java.util.ArrayList;
    导入java.util.array;
    导入java.util.List;
    导入java.util.Scanner;
    公共类矩阵驱动程序{
    公共静态void main(字符串[]args)引发FileNotFoundException{
    扫描仪键盘=新扫描仪(System.in);
    System.out.println(“输入文件名:”);
    字符串文件名=keyboard.next();
    列出问题=读取问题(文件名);
    系统输出打印(问题);
    键盘关闭();
    }
    私有静态列表读取问题(最终字符串文件名)引发FileNotFoundException{
    Scanner fileReader=new Scanner(new FileInputStream(filename));
    int numberOfProblems=fileReader.nextInt();
    列表问题=新数组列表(numberOfProblems);
    
    对于(int i=1;i是给定的文本格式?文本文件?是的,它与这里列出的一样,没有空格,也没有单独的文件。没有空格,我的意思是行与行之间没有空格,对歧义表示歉意。主要问题是,在MatricesDriver的构造函数中,只初始化一次行和列。这意味着它正在导出3和4。以及lat呃,如果你第三次调用readMatrix,它仍然在处理这些维度。你需要将文件读取与矩阵/问题读取分开。这只是一个定义所有矩阵的巨大方法吗?还是一堆get方法?抱歉,我对这一点很陌生。代码的最终游戏是两个添加3x4矩阵和子矩阵计算2x2矩阵,然后打印出来。我认为我的思路正确,我更新了代码。好的。请您将答案标记为有用或正确,以结束本主题。谢谢。哦,是的,对不起。给您。再次感谢
    class Matrix {
        private int[][] values;
    
        public Matrix(int[][] values) {
            this.values = values;
        }
    
        public int[][] getValues() {
            return values;
        }
    
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("Matrix [values=\n");
            for (int i = 0; i < values.length; i++) {
                sb.append("\t" +  Arrays.toString(values[i]) + "\n");
            }
            sb.append("]");
            return sb.toString();
        }
    }
    
    class Problem {
        private String operation;
        private Matrix first;
        private Matrix second;
    
        public Problem(String operation, Matrix firstMatrix, Matrix secondMatrix) {
            this.operation = operation;
            first = firstMatrix;
            second = secondMatrix;
        }
    
        public String getOperation() {
            return operation;
        }
    
        public Matrix getFirst() {
            return first;
        }
    
        public Matrix getSecond() {
            return second;
        }
    
        @Override
        public String toString() {
            return "Problem [\noperation=" + operation + ", \nfirst=" + first + ", \nsecond=" + second + "\n]";
        }
    }
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Scanner;
    
    public class MatricesDriver {
        public static void main(String[] args) throws FileNotFoundException {
             Scanner keyboard = new Scanner(System.in);
             System.out.println("Enter name of file: ");
             String filename = keyboard.next();
    
             List<Problem> problems = readProblems(filename);
             System.out.println(problems);
             keyboard.close();
        }
    
        private static List<Problem> readProblems(final String filename) throws FileNotFoundException {
            Scanner fileReader = new Scanner(new FileInputStream(filename));
            int numberOfProblems = fileReader.nextInt();
            List<Problem> problems = new ArrayList<>(numberOfProblems);
            for (int i = 1; i <= numberOfProblems; i++) {
                problems.add(readProblem(fileReader));
            }
            fileReader.close();
            return problems;
        }
    
        private static Problem readProblem(Scanner fileReader) throws FileNotFoundException {
            fileReader.nextLine(); // go to next line
            String operation = fileReader.nextLine(); // read problem operation
            int rows = fileReader.nextInt(); // read number of rows 
            int columns = fileReader.nextInt(); // read number of columns
            Matrix firstMatrix = readMatrix(rows, columns, fileReader);
            Matrix secondMatrix = readMatrix(rows, columns, fileReader);
            return new Problem(operation, firstMatrix, secondMatrix);
        }
    
        private static Matrix readMatrix(final int rows, final int columns, final Scanner fileReader) throws FileNotFoundException {
            int[][] result = new int[rows][columns];
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < columns; j++) {
                    result[i][j] = fileReader.nextInt();
                }
            }
            return new Matrix(result);
        }
    
    }