【问题标题】:How to sort a large text file's data into a multi-dimensional array?如何将大型文本文件的数据排序为多维数组?
【发布时间】:2013-05-19 01:56:02
【问题描述】:

我有一个非常大的数据文件。它从一个我想忽略或从等式中删除的大段开始,然后它有一年,例如1974,然后是 6 个空格,然后是表示月份的数字,例如1,然后它有 31 个数据条目,我想将它们排序到一个 3D 数组中。

我想我已经接近解决它了,但我不断收到异常 java.lang.ArrayIndexOutOfBoundsException

完整的错误是:

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 31 在 pkg110_term3.GetData.readFile(GetData.java:48) 在 pkg110_term3.Main.main(Main.java:25) Java 结果:1

这是我的代码:

public class GetData {

    public String[][][] sortedData = new String[34][12][31];

    int a = 0;
    int b = 0;
    int c = 0;

    private Scanner rainFile;

    //method for opening the file
    public void openFile() {

        try{
            rainFile = new Scanner(new File("C:\\\\Users\\\\admin\\\\Documents\\\\NetBeansProjects\\\\110_term3\\\\WeatherDataFiles\\\\rainfall.txt"));
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(null, "Check the file path is correct.", "No file found!", JOptionPane.ERROR_MESSAGE);
        }
    }

    //method for reading the file
    public void readFile(){

        if(rainFile.equals("Daily Rainfall Totals (mm), Hazelrigg Weather Station, Lancaster University (Meteorological Office Climatological Station Number 7236) \n" +
"Brian Davison, LEC, Lancaster University, data obtained March 2012 \n" +
"Format=Year, Month, 1-31 daily precipitation values. Any entry set to -99.99 means that no data exists for that day. ")){
            rainFile.remove();
        }
        while(rainFile.hasNext()){
            rainFile.next();
            a++;
            while(rainFile.hasNext()){
                rainFile.next();
                b++;
                for(int i = 0; i < 31; i++){
                    String day = rainFile.next();
                    sortedData[a][b][c] = day;
                    c++;
                }
            }
        }           
        }

        //close the file once it's been used
        public void closeFile(){
            rainFile.close();
        }


        //test method to see if array is full
        public void arrayTest(){
            System.out.print(sortedData[0][0][0]);
            System.out.print("\n");
            System.out.print(sortedData[0][1][0]);
            System.out.print("\n");
        }

}

我最近确实问过一个类似的问题,但我的代码从那以后发生了很大变化。

提前致谢。

前2年的降雨数据+我要去掉的段落:

Daily Rainfall Totals (mm), Hazelrigg Weather Station, Lancaster University (Meteorological Office Climatological Station Number 7236) 
Brian Davison, LEC, Lancaster University, data obtained March 2012 
Format=Year, Month, 1-31 daily precipitation values. Any entry set to -99.99 means that no data exists for that day. 
1974      1   0.00   0.00   1.70   3.30   8.70   2.30  12.70  13.10   0.01  13.50   1.50   5.50   1.90  15.40   6.50   7.70   4.00   0.10   0.00   0.00   0.00   8.00   0.20   0.01   0.01   7.00   8.00   0.20   2.30   7.00   0.20
1974      2   6.60  14.90   0.70   5.00   7.30   0.80   0.20   9.40   5.50  10.50   5.50   2.50   0.80   6.90   2.50   0.30   0.00   0.01   0.00   1.80   0.40   0.00   0.00   0.20   0.01   0.01   0.01   7.40 -99.99 -99.99 -99.99
1974      3   2.20   0.00   0.60   0.60   0.00  12.80   0.01   0.01   0.01   0.10   0.01   0.00   0.50   3.70   6.80   2.50   9.10   1.50   0.01   0.01   0.00   0.00   0.00   0.20   0.20   0.00   0.00   0.00   0.00   0.00   0.00
1974      4   0.00   0.01   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.70   0.80   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.01   0.00   0.00   0.00   0.00   0.00   0.00   0.01   0.00   0.01   0.00   0.00 -99.99
1974      5  35.60   0.90   0.60   0.00   0.01   0.00   0.00   0.10   4.50   2.40   0.01   2.70   3.00   0.00   0.00   0.01   0.01   1.20   1.30   3.10   1.00   7.40   7.30   0.01   0.01   0.01   1.00   4.10   0.00   0.00   0.01
1974      6   1.80   0.01   0.00   0.01  15.50   8.80   3.90   3.50   2.20   5.90   0.00   0.00   0.00   0.00   5.20   4.00   0.01   6.20   0.01   0.00   0.00   0.00   0.00   0.00   0.00   0.01   0.00   0.00   0.00  16.70 -99.99
1974      7   0.01  32.30   3.70  16.40   0.01   1.70   0.10   0.20   2.90   1.80   0.01   0.00   0.10  11.50  16.00   2.20   0.01   0.80   5.20   0.00   0.01  10.00   0.10   0.00   6.80   0.00   4.00   1.30  15.00   9.20   4.20
1974      8   0.00   0.00   0.00   0.00   0.00   0.00   0.10   7.30  19.40   4.40  16.40   0.01   0.10   5.60   0.00   1.20   0.00   0.00   0.00   0.00   1.00   1.70   0.10   0.20   3.80   7.60   0.01   0.00   0.01   0.00   5.50
1974      9   1.40   7.60   3.90  29.80  12.90  12.80  16.80  22.40   1.10   0.01   0.50  12.00   0.01   0.50   0.20   8.50   0.01   0.00   1.20   8.80   1.40  12.70   7.90  19.80   2.20   0.70  16.40   0.00   0.01   0.01 -99.99
1974     10  12.30   0.20   6.20   0.01   0.01  11.30   0.20   0.00   0.00   0.10   0.00   0.00   0.00   0.01   5.10   0.01   4.20  16.80   8.30   0.50   0.01   0.01   0.00   0.70   0.20   2.70   1.10   0.00   0.00   4.30   2.40
1974     11   0.01   8.40   0.80   0.00   0.90   0.20   9.10   2.60   6.00  11.60   6.00   2.30  15.60   6.40   3.20   0.01   0.00   0.00   2.50   0.01   0.30   1.60   5.60  11.50   2.30   0.90   3.40   0.01   8.10   2.10 -99.99
1974     12   0.80   0.30   2.30   0.90   0.01   0.60   7.80   1.20   5.90   8.70   4.80   1.20   4.00   0.00   7.80   5.20   5.20   1.80   0.00   4.30   2.30   0.01   7.80   2.70  10.00   2.00   3.80   1.60   0.50   1.50   0.00
1975      1   3.30   1.40   0.01   2.20   0.10  16.80   4.70   0.40   0.10   5.70   1.60   7.60   1.80   4.00   2.10  10.70   7.20   1.00   6.80   4.30  25.10  10.20   0.20  13.20   3.30   6.70   2.10   0.70   2.10   8.20   5.90
1975      2   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   3.10   0.80   1.60   6.80   1.70   0.00  16.00   0.20   0.00   0.00   0.90   0.00   0.00   2.50   0.00   0.00   0.00   0.00   0.00 -99.99 -99.99 -99.99
1975      3   0.50   2.20   0.50   9.90   0.00   6.90   0.00   0.00   0.01   0.10   0.10   0.00   0.00   0.01   0.00   0.01   0.01   0.01   0.00   0.00  15.60   0.01   0.00   0.01   8.80   1.10   0.01   0.00   0.20   1.00   0.00
1975      4   2.80   0.01   0.01   0.01   0.01   3.10   0.01   0.01   0.40   4.40   2.40   1.20   2.00   7.80   0.10   5.40   3.60   6.20   1.80   7.60   2.80   0.10   0.10   0.00   0.00   0.00   0.00   5.40   0.30   8.00 -99.99
1975      5   2.10   0.01   0.00   0.00   0.00   0.00   1.20   4.80   1.80   0.80   0.10   2.10   5.20   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.01   0.00   0.01   0.01   0.00   0.00   0.00   0.00   0.20   0.00
1975      6   3.10   1.90   3.40   5.60   4.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.10   0.00   0.40   0.00   0.01   1.10   1.50   1.40   0.00   0.00   0.00   0.01   0.00   0.00   0.00   0.00   0.00   0.00 -99.99
1975      7   0.00   0.00   0.01   0.01   0.00   0.00   0.01   0.10   7.20   7.90   0.01   5.50   5.90  18.10   0.01   0.00   7.00   0.01   4.10   2.20  15.60  32.80   2.50   7.20   2.50   0.01   0.00   0.01   0.01   0.01   0.00
1975      8   0.00   0.00   0.00   2.80   2.70   0.00   1.30   5.80   3.60   0.00   0.00   0.01   0.00  11.40  26.70   0.30   0.00   0.01   5.20   0.20   8.00   0.00   0.80   4.60   0.00   0.00   0.00   0.00   7.50   0.50   0.00
1975      9   0.00   0.40   0.01   5.40   2.00   0.90   1.30   9.70  13.70  23.50  18.90   0.20   0.00   0.00   0.00   0.00   6.90   0.30   3.80   1.80   0.00   7.40   0.60  32.00   5.60   3.40  13.50   0.00   4.60  19.90 -99.99
1975     10   8.30  21.10   0.20   5.00   0.20   0.00   0.00   0.01   1.80   0.00   0.00   0.00   0.01   0.10   1.20   1.20   0.00   0.00   0.00   0.00   0.00   0.01   6.00   0.00   0.01   0.00   0.00   0.00   0.01   0.40   3.20
1975     11   8.20   9.70   0.01   8.70   4.90   0.01   0.00   0.00   0.50   0.40   0.10   0.00   0.00   5.80  17.50   0.01   0.00   4.60   3.00   0.00   0.00   0.20   5.00   4.20  11.50   6.80   7.20   0.01   3.10   5.00 -99.99
1975     12  43.20   0.01   0.01   0.01   0.01   0.40   0.01   0.01   0.01   0.01   3.20   0.00   0.01   0.00   0.01   0.20   0.00   1.30   0.20   0.01   0.01   0.01   3.10   8.40   0.01   0.01   0.80   0.10   0.40   3.20  10.70

我刚刚意识到每个月都用一条线分隔,我可以用它来简化排序吗?

【问题讨论】:

  • 给我们堆栈跟踪。找到跟踪所说的正在抛出 IndexOutOfBounds 的行号,并告诉我们它是什么。
  • 它在第 31 行。这是完整的错误:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 31 at pkg110_term3.GetData.readFile(GetData.java:48) at pkg110_term3.Main.main(Main.java:25) Java Result: 1 它与 sortedData[a][b][c] = day; 一致
  • 你能在你的 rain.txt 中显示几行吗?
  • 当然,我在它的前 2 年进行了编辑。虽然它非常长。

标签: java arrays sorting multidimensional-array java.util.scanner


【解决方案1】:

如果您的代码再次尝试执行以下循环,c 的起始值将是 31

            for(int i = 0; i < 31; i++){
                String day = rainFile.next();
                sortedData[a][b][c] = day;
                c++;
            {

您在开头设置abc,然后只增加它们。

【讨论】:

  • 嘿,感谢您指出这一点。我刚刚对其进行了更改,以便将 c 替换为 i。但是我仍然遇到了越界异常。
  • 现在看看b。当您切换到第 2 年时,您的索引将是 12 并且再次超出范围。
猜你喜欢
  • 2013-05-12
  • 1970-01-01
  • 2020-09-30
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多