for (int i = 0; i<list.size(); i++){
int j = list.size() - i - 1;
System.out.println(list.get(j));
Не могу понять как работает этот алгоритм. Почему именно формула int j = list.size() - i - 1; выводит строки в обратном порядке.
int j = list.size() - i вот такая запись понятна, так как i<list.size(); но почему ещё -1? Может кто подробно расписать механику?
Дмитрий
35 уровень
Можете объяснить механику этого алгоритма?
Решен
Комментарии (12)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Mikhail
12 августа 2020, 18:32
Элемент 1 Элемент 2 Элемент 3 Элемент 4
порядковый № 0 порядковый № 1 порядковый № 2 порядковый № 3
list.size() = количеству элементов (4 шт)
Элемент 1 имееет порядковый № 0 (индекс 0)
Элемент 3 имееет порядковый № 2 (индекс 2)
В программировании отсчет идет с "нуля", а не с "единицы".
0
Дмитрий
12 августа 2020, 18:35
вопрос не в этом совсем
0
Mikhail
12 августа 2020, 18:53
i = 0
j = 4 - 0 - 1 = 3
list.get(index 3) - первый элемент
i = 1
j = 4 -1 - 1 = 2
list.get(index 2) - второй элемент
0
Regina Software Developer Expert
12 августа 2020, 18:07
потому что в списке размером 20, нет индекса 20, так как отсчет индексов начинается с нуля.
0
Дмитрий
12 августа 2020, 18:21
ну да, поэтому идёт минус i, а почему ещё минус 1?
0
Regina Software Developer Expert
12 августа 2020, 18:27
вы о чем? вот у вас первый обход цикла
i = 0, list.size = 20, j = list.size() - i - по вашей логике = 20 - 0 = 20
list.get(20) выпадет с exception так как нет 20 индекса в списке
так же и последний обход цикла
i = 19, так как i<list.size()
j = 20 - 19 = 1 последний элемент, который возьмут будет 1, а 0 куда денется?
0
Дмитрий
12 августа 2020, 18:36
ну по этой логике тогда 20 - i (равно 0) - 1 = 19, почему формула тогда не
for (int i = 0; i<list.size(); i++){
int j = list.size() - 1;
0
Regina Software Developer Expert
12 августа 2020, 18:37
ну тогда у вас же будет только 19 индекс всегда браться, ну? сколько бы обходов ни было
0
Regina Software Developer Expert
12 августа 2020, 18:44
окей
ваш for
1) упал с exception
2) даже если не упал, возьму размер меньше 20, давайте 5
ваш цикл будет брать индексы
i = 0, list.size() = 5, i < 5, int j = list.size() - i;
1 обход i = 0, j = 5 - 0 = 5;
2 обход i = 1, j = 5 - 1 = 4
3 обход i = 2, j = 5 - 2 = 3
4 обход i = 3, j = 5 - 3 = 2
5 обход последний, так как i = 4 и 4 < 5 (5 не меньше 5), j = 5 - 4 = 1
Итог: в листе размером 5, 5 индексов (0, 1, 2, 3, 4), соответственно
1) индекс 0 ваш цикл не выведет
2) цикл упадет с exception так как нет в этом листе индекса 5
0
Regina Software Developer Expert
12 августа 2020, 18:46
правильный for
i = 0, list.size() = 5, i < 5, int j = list.size() - i - 1;
1 обход i = 0, j = 5 - 0 - 1 = 4
2 обход i = 1, j = 5 - 1 - 1 = 3
3 обход i = 2, j = 5 - 2 - 1 = 2
4 обход i = 3, j = 5 - 3 - 1 = 1
5 обход последний, так как i = 4, j = 5 - 4 - 1 = 0
Итог: цикл выведет индексы 4, 3, 2, 1, 0 - все, что есть в листе, ничего не упустив и не упав
+4
Regina Software Developer Expert
12 августа 2020, 18:48
а если уж взять еще и ваше предложение
то тут вообще весело
1 обход i = 0, j = 5 - 1 = 4
2 обход i = 1, j = 5 - 1 = 4
3 обход i = 2, j = 5 - 1 = 4
4 обход i = 3, j = 5 - 1 = 4
5 обход последний, так как i = 4, j = 5 - 1 = 4
Итог: всегда будет выводиться последний элемент
0
Дмитрий
12 августа 2020, 19:53
Всё, спасибо огромное. Понял механику.
+1