Chcę zrozumieć logikę przeglądania listy w pętli. Kiedy dojdę do końca listy, chcę, aby indeks ponownie zaczynał się od 0. Lista działa w pętli i nastąpi zakończenie, więc nie będzie to nieskończona pętla.

Widziałem rozwiązanie używające operatora%, ale go nie rozumiem. Coś jak poniżej, ale zamiast tego z%. Chcę zrozumieć, jak to zadziała.

 for(int i = 0; i < n; i++) { 
   if(i == n - 1) { i = 0; }
}
0
Shrads 2 kwiecień 2020, 23:56

4 odpowiedzi

Najlepsza odpowiedź

operator modulo % to reszta po podziale.

Biorąc pod uwagę dwie liczby dodatnie, a i n, a% n jest pozostałą częścią dzielenia euklidesowego a przez n, gdzie a jest dzielnikiem, a n jest dzielnikiem.

Powiedziałeś, że masz listę, jeśli użyjesz % list.length() to da ci wartości od 0 do list.length ().

Zobacz poniższy kod:

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()));
}

To daje:

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

Możesz to sprawdzić działając tutaj.

3
jeprubio 2 kwiecień 2020, 21:20
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
peprumo 2 kwiecień 2020, 21:39

Możesz zrobić coś takiego:

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

% daje ci pozostałą część podziału.

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

Dzięki % możesz zrobić coś takiego:

// Will be an infinite loop 
for(int i = 0; i < n; i++) { 
   if(i == n - 1) { i = i%(n-1); }
}
0
Pritam Banerjee 2 kwiecień 2020, 21:12

Możesz zwiększyć licznik o 1 i wziąć pozostałą część podzieloną przez rozmiar listy. Operator % w Javie pobiera resztę po podzieleniu przez liczbę, tj. a % b zwraca resztę, gdy a jest podzielone przez b. Ergo, kiedy licznik osiągnie rozmiar listy, reszta będzie wynosić zero i zostanie zresetowana do 0; gdy licznik jest mniejszy niż rozmiar listy, reszta po podzieleniu przez rozmiar będzie samym licznikiem.

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

Zobacz też: https://docs.oracle.com/javase/tutorial /java/nutsandbolts/op1.html

1
iota 2 kwiecień 2020, 21:12