• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy ta pętla for w kodzie może mieć inną postać?

Cloud VPS
0 głosów
298 wizyt
pytanie zadane 17 października 2018 w Java przez Kubs Mądrala (5,190 p.)

Witajcie,

ten kod działa i wyświetla informację w zależności czy podane odpowiedzi są poprawne lub nie. Ale jak on dokładnie się wykonuje? Najbardziej chodzi mi o te linijki kodu:

for (boolean radioChecked : checkedAnswer)
                    check = check && radioChecked;

                if (check) {
                    for (boolean radioAnswer : answer)
                        correct = correct && radioAnswer;

 

 

Cały kod:

 

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean check = true;
                boolean correct = true;

                for (boolean radioChecked : checkedAnswer)
                    check = check && radioChecked;

                if (check) {
                    for (boolean radioAnswer : answer)
                        correct = correct && radioAnswer;

                    if (correct)
                        tv.setText(R.string.Good_answer);
                    else
                        tv.setText(R.string.Wrong_answer);
                }
            }
        });

 

komentarz 17 października 2018 przez X3h Dyskutant (9,540 p.)
Debaguj to się dowiesz dokładnie. Poza tym jak możesz coś pisać i nie wiedzieć co. System.out.println i takie inne.

2 odpowiedzi

0 głosów
odpowiedź 17 października 2018 przez k222 Nałogowiec (30,150 p.)

Z tego co domyśliłem się z nazw (dobre nazewnictwo btw) to do zrozumienia tego kodu musisz wiedzieć dwie rzeczy:

- pętla for(typ element : tablica) to tzw. pętla for each, te dwie pętle są równoważne:

for (int i = 0; i < tablica.length; i++) {
            System.out.println("indeks: " + i + " wartość: " + tablica[i]);
        }
for (int i : pomiary) {
            System.out.println(" wartość: " + i);
        }

zauważ, że w drugim przypadku nie ma dostępu do indeksu,

- operator && to operator koniunkcji, czyli zwraca prawdę kiedy element po prawej i lewej są równe 1,

 

ten kod działa więc tak, że najpierw ustawiasz check i correct na true, potem iterujesz pętlą for each po wszystkich elementach tablicy checkedAnswer, przy czym wystarczy, żeby jedna wartość radioChecked była false, żeby ustawić check na false, bo 1 && 0 = 0, a dalej 0 && cośtam = 0 zawsze, dalej jeżeli wszystkie wartości w tablicy checked Answers są równe true, to powtarzasz dokładnie ten sam proces, sprawdzając czy wszystkie wartości w tablicy answer są true, po czym wypisujesz odpowiedź

komentarz 17 października 2018 przez Wiciorny Ekspert (281,390 p.)

pętla for(typ element : tablica) to tzw. pętla for each, te dwie pętle są równoważne

czysto praktycznie może, teoretycznie i  pamięciowo, logicznie + czasowo i to co się dzieje pod spodem nie jest równoważne....  

Równoważność można definiować jako dwuargumentowy funktor zdaniotwórczy (spójnik zdaniowy), którego funkcja prawdziwościowa odpowiada znaczeniu zwrotu …wtedy i tylko wtedy, gdy…. Dla danych zdań {\displaystyle p,q}p,q ich równoważność zapisuje się symbolem {\displaystyle p\leftrightarrow q}{\displaystyle p\leftrightarrow q}. Jednym z praw dotyczących spójnika równoważności jest to, że ma on tę samą wartość logiczną, co zdanie

{\displaystyle (p\rightarrow q)\land (p\leftarrow q)}{\displaystyle (p\rightarrow q)\land (p\leftarrow q)},

jednak słusznie potem twierdzisz, że  wewnętrznie jednak to nie jest to samo a no właśnie więc nie zachodzi implikacja równoważności bo nie jest to relacja zwrotna haha ;D smieje się, ale czepiam się. 

 

Generalnie też można zapisać to w postaci WZORCA PROJEKTOWEGO ITERATORA - wtedy mamy dostęp do swobodnej modyfikacji nawet.  

komentarz 18 października 2018 przez Kubs Mądrala (5,190 p.)
edycja 18 października 2018 przez Kubs

@k222,  Dzięki.. jeszcze jedno.. zastanawiałem się jak działa ten kod..

skoro mam 

  boolean check = true;

to myślałem, że ta linijka

 check = check && radioChecked;

powinna mieć operator  == zamiast = bo chodzi nam o true ==true, ale tak to nie działa. To dlaczego mamy w tym polu ustawione true, a nie po prostu false?

komentarz 18 października 2018 przez Kubs Mądrala (5,190 p.)
@Wiciorny, to już jest kosmos dla mnie ta równoważność :) A jak byś zapisał to wg wzorca żebyśmy mieli dostęp do swobodnej modyfikacji? Tzn teraz nie mamy?
komentarz 18 października 2018 przez Wiciorny Ekspert (281,390 p.)
napiszę jak będę w domu, no nie możesz np. korzystając ze streama modyfikować danych wewnątrz np listy. Bo stream jest jest podlega mutacji, jedynie można transformować ... [ dokonywac selekcji na danych], ale nie wpływać bezpośrednio na wartości tych obiektów
komentarz 18 października 2018 przez Kubs Mądrala (5,190 p.)
Ok, tylko proszę użyj jak najprostrzego wyjaśnienia :)
0 głosów
odpowiedź 17 października 2018 przez miro Pasjonat (23,870 p.)

Te pętle to tzw. foreach. Można je zamienić na zwykłe pętle lub na forEach z java 8. Niestety nie widzę czy w podanym kodzie mamy do czynienia z zwykłymi tablicami czy z kolekcjami. 
 

for (boolean radioAnswer : answers){
                        correct = radioAnswer;}

//dla tablic
for(int i = 0; answers.length; i++){
correct = answers[i];
}

// dla kolekcji 
for(Iterator<Boolean> i = answers.iterator(); i.hasNext(); ) { // taki while
  correct = i.next();
}

W sumie w tym drugim przypadku lepszy byłby while. Trochę uprościłem kod. 

komentarz 18 października 2018 przez Kubs Mądrala (5,190 p.)

Tu correct jest polem typu boolean? Czyli wartość elementu radioAnswer zapisywany jest w polu correct?

komentarz 18 października 2018 przez Wiciorny Ekspert (281,390 p.)
po prostu correct  zostaje przypisana wartość true/false. Tablica to  kolekcja stąd nie widzę sensu pisać  "dla tablic"  i " dla kolekcji" ....

Podobne pytania

0 głosów
1 odpowiedź 253 wizyt
pytanie zadane 22 sierpnia 2019 w JavaScript przez Dru Nowicjusz (180 p.)
0 głosów
1 odpowiedź 527 wizyt
pytanie zadane 7 grudnia 2017 w Java przez melkarv Nowicjusz (140 p.)
0 głosów
1 odpowiedź 230 wizyt
pytanie zadane 16 października 2015 w Java przez KULTI Obywatel (1,400 p.)

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,834 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...