Я хочу сохранить три верхних значения из какого-либо источника в списке. Упрощенный пример здесь:
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> top3 = new ArrayList<>();
while (true) {
Integer newInt = Integer.valueOf(sc.nextInt());
for (int i = 0; i < 3 && i <= top3.size(); i++) {
if (i == top3.size() || newInt.compareTo(top3.get(i)) > 0) {
newInt = top3.set(i, newInt);
}
}
System.out.println(top3.toString());
}
}
}
Но проблема в том, что программа выдает java.lang.IndexOutOfBoundsException
. Так вот вопрос: разве оператор ||
не должен пропускать проверку условий после достижения первого? Потому что если бы это было так, я бы не получил ошибку.
Как я указал в своем ответе, проблема заключалась в методе «.set()», поскольку я ожидал, что он добавит List
, если метод будет применен к его концу.
🤔 А знаете ли вы, что...
Java в основном используется для разработки приложений для мобильных устройств и веб-приложений.
Ответ в том, что (COND1 || COND2)
фактически перестает проверять, истинно ли COND1
.
Я обнаружил, что исключение выдается методом set()
, а не методом get()
, что доказывает, что ответ на вопрос - «да».
Проблема в том, что я ожидал, что top3.set(i, newInt)
просто добавит top3
с newInt
, когда i
достигнет top3.size()
. Но согласно документации , этот метод просто выбрасывает упомянутое java.lang.IndexOutOfBoundsException
, если так.
Я решил проблему так:
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> top3 = new ArrayList<Integer>();
while (true) {
Integer newInt = Integer.valueOf(sc.nextInt());
for (int i = 0; i < 3; i++) {
if (i == top3.size()) {
top3.add(newInt);
break;
} else if (newInt.compareTo(top3.get(i)) > 0) {
newInt = top3.set(i, newInt);
}
}
System.out.println(top3.toString());
}
}
}