1

我通过读取文件创建了一个二维数组,我想返回这个数组。但是,由于读取文件,我使用 try-catch 块。此时我无法从该函数返回此数组。此外,当我尝试在 try-catch 块中写入此数组的元素时,它可以工作,但在块外却不行。我应该怎么做才能得到数组?

我的代码如下:

 public static double[][] readFile(String fileName)  {
     final double[][]data = new double[178][13];
      int x=0, y=0;
    try{
    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    String line;
    while((line = reader.readLine())!= null){
        String[]values=line.split(",");
        for(String str:values){
            double str_double=Double.parseDouble(str);
            data[x][y]=str_double;
            System.out.print(data[x][y]+" ");
        }
        System.out.println();
    }
    reader.close();

    }
    catch(Exception e){}

     return data;

 }

最后,在大家的帮助下,我找到了解决方案。我的错误之一是定义 y。因为每行有 14 个元素,但我将其分配给 13。我还更改了数组的分配方法。也许有人需要,所以我将其发布到我的解决方案:

public static double[][] readFile(String fileName)  {
      double[][]data=new double[178][14];
      int x=0, y;
    try{
    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    String line;
    String[]values;
    while((line = reader.readLine())!= null){


        values=line.split(",");

       for(y=0; y<values.length; y++){
           data[x][y]=Double.parseDouble(values[y]);
       }
       x++;
    }



    reader.close();

    }
    catch(Exception e){System.out.println("Aborting due to error: " + e);}

     return data;

 }
4

2 回答 2

1

原始代码在数组中只分配一个值,即 element data[0][0],因为x并且y永远不会从 0 改变。

假设这x是行并且y是列(行中的元素),以下应该有效:

public static double[][] readFile(String fileName) {
     final double[][]data = new double[178][13];
      int x, y;
    try{
    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    String line;
    x = 0; // Reset the line counter
    while((line = reader.readLine()) != null) { // Read a new line
        y=0; // Reset the column counter, since this is a new line 
        String[]values=line.split(",");
        for(String str:values){
            double str_double=Double.parseDouble(str);
            data[x][y]=str_double;
            System.out.print(data[x][y]+" ");
            ++y; // Advance to the next column
        }
        ++x; // Advance to the next line
        System.out.println();
    }
    reader.close();

    } catch (Exception e) {
        System.out.println("Aborting due to error: " + e);
    }    
     return data;    
 }

当然,上面假设调用readLine()or不会导致错误发生parseDouble()。如果发生任何此类错误,或ArrayIndexOutOfBoundsException发生错误,则返回的数组将仅包含迄今为止读取的元素。

这是一个改进的版本,再次尽可能多地保留原始代码:

public static double[][] readFile(String fileName) {
    ArrayList<double[]> numbers = new ArrayList<double[]>();        

    try {
        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line;

        while ((line = reader.readLine()) != null) { // Read a new line             
            int y=0; // Reset the column counter, since this is a new line 

            String[] values = line.split(",");

            if (values.length > 0) {
                double[] elements = new double[values.length];

                for (String str:values) {
                    double str_double;
                    try {
                        str_double = Double.parseDouble(str);
                        elements[y] = str_double;
                        System.out.print(elements[y] + " ");
                        ++y; // Advance to the next column
                    } catch (Exception e) {
                        continue; // Not a double, ignore
                    }
                }                   
                numbers.add(elements);                  
            } else {
                numbers.add(new double[0]); // No numbers read from the line
            }
            System.out.println();
        }                       
        reader.close();
    } catch (Exception e) {
        System.out.println("Aborting due to error: " + e);
    }

    return numbers.toArray(new double[0][0]);
}

这两个版本都没有经过测试,但它们都应该接近可行的解决方案。

第二种方法更通用,应该是首选,但为了避免在doubleand之间装箱/拆箱Double,它假设,如果读取为字符串的任何元素不是 valid double,则数组中的相应位置elements将由下一个 valid 填充double,如果有的话。因此,例如,如果一行中有 10 个元素并且总共只有 8 个是有效的,那么数组的前 8 个位置将包含这些元素的值,最后 2 个位置将包含0(在elements数组的初始化)。

于 2013-11-07T01:35:54.860 回答
0

没有特别需要将变量声明为最终变量。您也不需要将其声明为私有。

简单的

double[][]data = new double[178][13];

变量声明不正确

于 2013-11-07T01:40:04.470 回答