如何从文件(Java)将双精度数添加到2d数组中?

时间:2018-08-11 23:50:59

标签: java multidimensional-array java.util.scanner filereader

我看到的所有示例都涉及在文件开头指定行数和列数,但是我正在使用的方法使用以下内容读取文件:

1.0 2.0
3.0 4.0

并使用此数据创建一个二维数组并存储它,而无需指定行数和列数。

这是我编写的代码:

 public static double[][] readMatrixFrom(String file) throws FileNotFoundException {
     Scanner input = new Scanner(new FileReader(file));
     int rows =0;
     int columns =0;

     while(input.hasNextLine()){
         String line = input.nextLine();
         rows++;
         columns = line.length();     
     }
     double[][] d = new double[rows][columns]
     return d;      
}

由于我已经创建了2d数组,因此我不确定如何添加这些值。我试过了,但是得到了InputMismatchException

Scanner s1 = new Scanner(file);
double[][] d = new double[rows][columns]

for (int i= 0;i<rows;i++) {
    for (int j= 0;i<rows;j++) {
         d[i][j] = s1.nextDouble();
     }
}

3 个答案:

答案 0 :(得分:2)

如果您只想使用基本数组,则可以使用类似的方法实现

     Scanner input = new Scanner(new FileReader(file));

     int row=0;
     int col =0;
     String s="";

     //count number of rows
     while(input.hasNextLine()) {
         row++;
         s=input.nextLine();
     }

     //count number of columns
     for(char c: s.toCharArray()) {
         if(c==' ')
             col++;
     }

     col++; // since columns is one greater than the number of spaces

     //close the file
     input.close();

     // and open it again to start reading it from the begining
     input = new Scanner(new FileReader(file));
     //declare a new array
     double[][] d = new double[row][col];   

     int rowNum=0;
     while(input.hasNextLine()) {
         for(int i=0; i< col; i++) {
             d[rowNum][i]= input.nextDouble();
         }
         rowNum++;
     }

但是,如果您更喜欢使用Java集合,则可以避免再次读取该文件。只需将字符串存储在列表中,然后遍历列表以从中提取元素。

答案 1 :(得分:2)

根据您的输入,您的MySQL [distributor]> select prod_name, prod_price from products where vend_id in ("dll01", "brs01") order by prod_name; +---------------------+------------+ | prod_name | prod_price | +---------------------+------------+ | 12 inch teddy bear | 8.99 | | 18 inch teddy bear | 11.99 | | 8 inch teddy bear | 5.99 | | Bird bean bag toy | 3.49 | | Fish bean bag toy | 3.49 | | Rabbit bean bag toy | 3.49 | | Raggedy Ann | 4.99 | +---------------------+------------+ 7 rows in set (0.000 sec) 返回 7 而不是 2 ,因为它返回了function [bacteria_plot] = bacteria_growth(K,Kk,kK,Y) C = 100; r = 1; t = 0:20; K = 1000; Kk = 3000; kK = 5000; y(:,1) = (C.*exp(r.*t))./(1+(C./K).*exp(r.*t)); y(:,2) = (C.*exp(r.*t))./(1+(C./Kk).*exp(r.*t)); y(:,3) = (C.*exp(r.*t))./(1+(C./kK).*exp(r.*t)); hold on plot(t,y) hold off 的长度。

因此,请尝试计算columns = line.length();行中的列数

在尝试读取输入内容时,第二个String也使用了索引columns = line.split(" ").length;。应该像下面一样,

i

答案 2 :(得分:1)

为了使用未知大小的数组,您应该将数据读入Collection(例如List)中。但是,Collection仅适用于包装器类型。因此,如果您确实需要,则需要将元素复制回double(s)数组中。像

public static double[][] readMatrixFrom(String file) throws FileNotFoundException {
    Scanner input = new Scanner(new FileReader(file));
    List<List<Double>> al = new ArrayList<>();
    while (input.hasNextLine()) {
        String line = input.nextLine();
        List<Double> ll = new ArrayList<>();
        Scanner sc = new Scanner(line);
        while (sc.hasNextDouble()) {
            ll.add(sc.nextDouble());
        }
        al.add(ll);
    }
    double[][] d = new double[al.size()][];
    for (int i = 0; i < al.size(); i++) {
        List<Double> list = al.get(i);
        d[i] = new double[list.size()];
        for (int j = 0; j < d[i].length; j++) {
            d[i][j] = list.get(j);
        }
    }
    return d;
}

我通过在主文件夹中创建一个包含您的内容的文件并像这样运行它来进行测试的

public static void main(String[] args) {
    String file = System.getProperty("user.home") + File.separator + "temp.txt";
    try {
        System.out.println(Arrays.deepToString(readMatrixFrom(file)));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

然后我得到(假设您想要的话)

[[1.0, 2.0], [3.0, 4.0]]