有人知道我在这个循环中做错了什么吗?



在学校的一个项目中,我被要求编写一个程序,循环遍历一个名为revenue的数组列表中的值,并打印在遍历数组列表时revenue中的数字是增加、减少还是保持不变。

这是我写的

System.out.println("Year 1: No comperison");
for (int i = 0; i < revenues.size(); i = i + 1){
if (revenues.get(i) < revenues.get(i+1)){
System.out.println("Year "+ (i) +": increased");
} else if (revenues.get(i) > revenues.get(i+1)){
System.out.println("Year "+ (i) +": decreased");
} else {
System.out.println("Year "+ (i) +": stayed the same");
}
}

但是每当我运行程序时,它都会显示一条错误信息,因为这段代码。

错误

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 5 out of bounds for length 5
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
at java.base/java.util.Objects.checkIndex(Objects.java:359)
at java.base/java.util.ArrayList.get(ArrayList.java:427)

一般性改进:

  • 将要比较的年份存储在专用变量中(例如previousYear)
  • 尝试使用索引0进行循环,这更容易跟踪,因为这是Java数组和Java列表使用的!
  • 如果您想将0显示为1st年,只需将+1添加到显示输出的行中。
  • i++i = i + 1的简写

在我的例子中,我将一个名为previousYear的变量初始化为-1,无论如何,它都会显示第一年的增长,因为没有什么可比较的。希望这能有所帮助。:)

// Create the list of revenues
List<Integer> revenues = Arrays.asList(new Integer[]{ 1234, 2345, 2123, 2123 });
// Default last years revenue to -1 since we don't know it yet
int previousYear = -1;
// Compare each year to the previous year
for (int i = 0; i < revenues.size(); i++){
// Store the current year's revenue
int currentYear = revenues.get(i);
// Show comparison to the screen
if (previousYear == -1) {
System.out.println("Year "+ (i+1) +": no comparison");
} else if (currentYear > previousYear) {
System.out.println("Year "+ (i+1) +": increased");
} else if (currentYear < previousYear) {
System.out.println("Year "+ (i+1) +": decreased");
} else {
System.out.println("Year "+ (i+1) +": stayed the same");
}
// Store as previous year for next loop
previousYear = currentYear;
}

感谢用户fauzimh,他问了我一些有见地的问题,我找到了问题的答案。结果是,如果在比较时进行加法运算,就会超过数组列表的长度,所以我只需要做减法运算。

这是更新后的代码。

System.out.println("Year 1: No comparison");
for (int i = 1; i < revenues.size(); i = i + 1){
if (revenues.get(i) < revenues.get(i-1)){
System.out.println("Year "+ (i+1) +": decreased");
} else if (revenues.get(i) > revenues.get(i-1)){
System.out.println("Year "+ (i+1) +": increased");
} else {
System.out.println("Year "+ (i+1) +": stayed the same");
}
}

我希望我是对的,因为它似乎有效。

最新更新