Цикл по списку - когда индекс достигает конца, начинайте с 0 - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу понять логику c зацикливания списка. Когда я достигну конца списка, я хочу, чтобы индекс снова начинался с 0. Список работает в al oop, и завершение будет происходить, поэтому оно не будет бесконечным l oop.

Я видел решение, использующее оператор%, но я его не понимаю. Нечто вроде ниже, но вместо%. Я хочу понять, как это будет работать.

 for(int i = 0; i < n; i++) { 
   if(i == n - 1) { i = 0; }
}

Ответы [ 4 ]

3 голосов
/ 03 апреля 2020

Оператор по модулю % является остатком после деления.

С учетом двух положительных чисел, a и n,% n является остатком от евклидова деления из а по п, где а является дивидендом и п является делителем.

Вы сказали, что у вас есть список, если вы используете % list.length(), это даст вам значения от 0 до list.length ().

См. Следующий код:

List<String> list = new ArrayList<String>();
list.add("first");
list.add("second");
list.add("third");

for (int i = 0; i < 10; i++) {
    System.out.println("element: " + list.get(i % list.size()));
}

это выводит:

element: first
element: second
element: third
element: first
element: second
element: third
element: first
element: second
element: third
element: first

Вы можете проверить его работу здесь .

1 голос
/ 03 апреля 2020

Вы можете увеличить счетчик на 1 и взять оставшуюся часть, деленную на размер списка. Оператор % в Java получает остаток после деления на число, т. Е. a % b возвращает остаток, когда a делится на b. Er go, когда счетчик достигнет размера списка, остаток будет равен нулю и будет сброшен до 0; если счетчик меньше размера списка, остаток от деления на размер будет являться самим счетчиком.

for(int i = 0, size = list.size(); ; i = (i + 1) % size){
    //do something; add terminating condition
}

См. также: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html

0 голосов
/ 03 апреля 2020
package testproj;

import java.util.ArrayList;
import java.util.List;

public class ListLoop {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("string1");list.add("string2");list.add("string3");
        int j=0; //loop braking.
        for (int i=0;i<=list.size();i++) {
            if (i == list.size()) {
                i=0;
            }
            //This will go infinite loop. need a way to break the loop.
            //Below is just demonstration.
            j++;
            if (j==10) break;

            System.out.println("Do something with " + list.get(i));
        }
    }
}
0 голосов
/ 03 апреля 2020

Вы можете сделать что-то вроде этого:

// Will be an infinite loop 
for(int i = 0; i < n; i++) { 
   if(i == n - 1) { i = 0; }
}

% дает вам остаток от деления.

10%2 == 0  // 10/2 = 5
10%3 == 1  // 10/3 = 3 and remainder 1

С % вы можете сделать что-то вроде этого:

// Will be an infinite loop 
for(int i = 0; i < n; i++) { 
   if(i == n - 1) { i = i%(n-1); }
}
...