为什么没有打印出正确的数组值?

Why are the correct array values not getting printed?

我正在尝试仅使用嵌套 if else 来打印 rollNumber 数组的标记。但是,我得到的输出是:

111 Honors
111 First Division
333 Fail

而输出应该是

111 Honors
222 First Division
333 Fail
444 Second Division

我哪里错了?我写的代码如下:

public class JavaApplication53 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int rollNumber[]={111, 222, 333, 444};
        int marks[]={81, 75, 43, 58};
        
        for(int i=0; i<rollNumber.length; i++) {
            if(marks[i]>49) {
                if(marks[i]>79) {
                    System.out.println(rollNumber[i] + " Honors");
                
                    if(marks[i]>59){
                        System.out.println(rollNumber[i] + " First Division");
                    } else {
                        System.out.println(rollNumber[i] + " Second Division");
                    }
                }
            } else {
                System.out.println(rollNumber[i]+ " Fail");
            }
        }
    }
}

我不知道预期的行为到底是什么,但这显然是一个问题:

if(marks[i]>79) {
    System.out.println(rollNumber[i] + " Honors");                
        if(marks[i]>59){
            System.out.println(rollNumber[i] + " First Division");
        } else {
            System.out.println(rollNumber[i] + " Second Division");
        }
        

if marks[i] > 79 它总是 > 59,所以永远不会输入 else

编辑:您可以使用 类:

创建域模型,而不是使用数组并使用索引 i 从中获取相应的值
class Category {
    final String name;
    final int boundary;

    Category(String name, int boundary) {
        this.name = name;
        this.boundary = boundary;
    }
}

class Grade {
    final int mark;
    final int rollNumber;

    Grade(int mark, int rollNumber) {
        this.mark = mark;
        this.rollNumber = rollNumber;
    }
}

(省略 getter 和 setter)

这可以阐明你的代码的含义。

编辑 2:然后你可以这样做

  Category[] categories = new Category[]{
        new Category("Honors", 80),
        new Category("First Division", 60),
        new Category("Second Division", 50),
        new Category("Fail", Integer.MIN_VALUE)
    };

    Grade[] grades = new Grade[]{
        new Grade(81, 111),
        new Grade(75, 222),
        new Grade(43, 333),
        new Grade(58, 444)
    };

    for (Grade grade : grades) {
        for (Category category : categories) {
            if (grade.mark >= category.boundary) {
                System.out.printf("%s %s%n", grade.rollNumber, category.name);
            }
        }
    }

你的逻辑不对。 如果你已经测试了 >79,那么在 [=] 中测试 >59 是没有意义的15=] 子句。请改用 else 子句。最里面的 if 应该在它所在的 ifelse 中。

if(marks[i]>79) {
......
} else {
    //move this if from the if clause to here: else clause
    if(marks[i]>59){
      .......
    }
}

或者,系统化是值得的,这样你就不会混淆自己。您从测试最低点 - 49 开始,然后测试最高点 - 79。也许 49、59、79 可以避免混淆,如下所示:

if(marks[i]>49) {
    if(marks[i]>59) {
        if(marks[i]>79) {
            System.out.println(rollNumber[i] + " Honors");
        } else {
            System.out.println(rollNumber[i] + " First Division");
        }
    } else {
        System.out.println(rollNumber[i] + " Second Division");
    }
} else {
    System.out.println(rollNumber[i]+ " Fail");
}

或:

if(marks[i]>79) {
    System.out.println(rollNumber[i] + " Honors");
} else if(marks[i]>59) {
    System.out.println(rollNumber[i] + " First Division");
} else if(marks[i]>49) {
    System.out.println(rollNumber[i] + " Second Division");
} else {
    System.out.println(rollNumber[i]+ " Fail");
}

我改进了你的代码。使用这个。

public static void main(String[] args) {
    int rollNumber[]={111, 222, 333, 444};
    int marks[]={81, 75, 43, 58};
    
    for(int i=0; i<rollNumber.length; i++) {
        if(marks[i]>79) {
            System.out.println(rollNumber[i] + " Honors");
        } else if(marks[i]>59) {
            System.out.println(rollNumber[i] + " First Division");
        } else if(marks[i]>49) {
            System.out.println(rollNumber[i] + " Second Division");
        } else {
            System.out.println(rollNumber[i] + " Fail");
        }
    }
}

希望问题越来越好!