0

我有一种方法可以计算出具有最高组合值的 3D 数组的元素组。我有 3 个嵌套循环用于遍历我的数组,并且在满足某些条件时,我想更改变量。但是,没有使用任何变量。如果超过,我不想改变它所在的for循环的任何int y迭代。int msumtotal

谢谢。这是我的代码:

    public void wettestMonth(){
        double sum = 0;
        double total = 0;
        int y = 0;
        int m = 0;

        //cycle through each year and month
        for(int i = 0; i < 34; i++){
            for(int j = 0; j < 12; j++){
                //reset the current month to 0 after each month has been cycled through
                sum = 0;
                for(int k = 0; k < 31; k++){
                    //only add the record if the current entry is not null (-99.99)
                    if(sortedData[i][j][k] != -99.99){
                        sum += sortedData[i][j][k];
                    }
                    //if the current month is wetter than the wettest one, make the current month the new wettest one
                    if(sum > total){
                        total = sum;
                        y = i;
                        m = j;
                    }
                }
            }
        }

        JOptionPane.showMessageDialog(null, "The wettest month on record was " +m +y, "Wettest Month.", JOptionPane.PLAIN_MESSAGE);

    }

编辑,我只是​​用while循环重建它,我在似乎是问题行的地方遇到了越界错误,if(sortedData[i][j][k] != -99.99)

编辑 2,这里是我声明和初始化的地方sortedData[][][]

公共类 GetData {

//initialises an array that holds 34 years, each with 12 months, each of which has 31 entries for reach day
public double[][][] sortedData = new double[34][12][31];

//initialises a new scanner named rainFile
private Scanner rainFile;

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

    try{
        //as the input for the scanner we use the rainfall file
        rainFile = new Scanner(new File("C:\\\\Users\\\\admin\\\\Documents\\\\NetBeansProjects\\\\110_term3\\\\WeatherDataFiles\\\\rainfall.txt"));
    }
    catch(Exception e){
        //if no file has been found a JOptionPane will display an error message telling the user to double-check the file path
        JOptionPane.showMessageDialog(null, "Check the file path is correct.", "No file found!", JOptionPane.ERROR_MESSAGE);
    }
}

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

    //ignore the first 3 lines in the data file
    String dump1 = rainFile.nextLine();
    String dump2 = rainFile.nextLine();
    String dump3 = rainFile.nextLine();

        //these nested for loops will dictate the current index of sortedData
        for(int i = 0; i < 34; i++){
            for(int j = 0; j < 12; j++){

                //ignores the year and month at the start of each line
                String dump4 = rainFile.next();
                String dump5 = rainFile.next();

                //this final nested for loop dictates the final index of sortedData
                for(int k = 0; k < 31; k++){

                    //asigns the current value of scanner rainFile to String a
                    String a = rainFile.next();

                    //converts the String a to a double type and then assigns it to the current index of sortedData
                    double dbl = Double.parseDouble(a);
                    sortedData[i][j][k] = dbl;
                }

            }
        }

    }
4

3 回答 3

3

您是否尝试过打印每个月的总和?

最明显的可能性是,由于有错误的相等检查,您的总和始终小于 0。

对于这条线,

sortedData[i][j][k] != -99.99

除非该值恰好是 -99.99 舍入的值,否则这将是正确的。这可能是无意的。例如,如果您以某种方式通过浮点数学构造值,由于舍入错误,您很可能不会得到完全相同的值。此外,像这样使用奇怪的哨兵值很容易出错并且可读性较差。如果可以的话,最好使用像 NaN 这样的明显标记值。

要查看问题,请考虑如果您的值略有不同会发生什么。比如说,-99.99000001。然后在第一天之后,你已经有了一个负值。一个月后,总和大约为 -3099.69000031,远小于 0。由于总和始终为负数,它永远不会优于原始总和 0,因此最好的永远不会更新。

您可能还想将更新检查移到日循环之外。这部分看起来应该使用整个月的总和,但是您正在使用该月每一天的部分总和来运行它。只要添加的值是非负的(但它们可能不是由于上述错误),它实际上不会导致错误的结果,但您仍然应该修复它。

                if(sum > total){
                    total = sum;
                    y = i;
                    m = j;
                }
于 2013-05-19T18:14:15.940 回答
0

Carefully, reviewed the first code snippet that has been provided, it appears to me that you have been doing if check for the size inside the for loop, moved the for loop vars to the finals, added some further comments.

You could try and run your swing app through the Eclipse debug and see what results you get at each line in your application ?

Would expect it to work given correct input 3D array))

/**
* This method calculates the wettest month during the certain period of time.
*/
public void wettestMonth(){
    double sum = 0;
    double total = 0;
    int y = 0;
    int m = 0;
    final int numberOfYearsToCycleThrough = 34;
    final int numberOfMonthsToCycleThrough = 12;
    //cycle through each year and month
    for (int i = 0; i < numberOfYearsToCycleThrough; i++) {
        for (int j = 0; j < numberOfMonthsToCycleThrough; j++) {
            sum = 0;
            for (int k = 0; k < 31; k++){
                //only add the record if the current entry is not null (-99.99)
                if (sortedData[i][j][k] != null && sortedData[i][j][k] != -99.99) {
                   sum += sortedData[i][j][k];
                }
            }
        //if the current month is wetter than the wettest one, make the current month the new wettest one
             if (sum > total) {
                total = sum;
                y = i;
                m = j;
             }
         }
     }
     JOptionPane.showMessageDialog(null, "The wettest month on record was " +m +y, "Wettest Month.", JOptionPane.PLAIN_MESSAGE);
}
于 2013-05-21T19:02:08.903 回答
0

我没有看到您的代码有任何问题。

也许以下条件永远不会评估为真?

if(sortedData[i][j][k] != -99.99)
于 2013-05-19T18:15:24.823 回答