6 svar
108 visningar
sampledragon5 är nöjd med hjälpen
sampledragon5 495
Postad: 29 okt 2021 12:08 Redigerad: 29 okt 2021 13:03

Iterator classen

List<String> fruit = new ArrayList<>(List.of("apple", "banana", "plum",
"peach", "pear", "kiwi"));

Iterator<String> iter = fruit.iterator();

while (iter.hasNext()) {

String word = iter.next();

if (word.startsWith("p")) {

iter.remove();

if (word.contains( "e" ) ) {
break;
}
}
}

// Hej! jag trodde att koden ovan skulle medföra att variabeln "fruit" skulle ha exakt samma string objekt efter loopen dvs inga objekt i listan "fruit" skulle raderas MEN det visade sig att vissa objekt raderades. Är det inte så att while loopen kommer att starta med "apple" ? för om det stämmer så kommer väll "apple" medföra att hela loopen breaks för den reserverade ordet "break" medför väll att hela loopen breakar dvs att man lämnar loopen ? För jag tror att iterator objektet  först är lika med första objektet i listan, sedan andra, sedan tredje mm. ( exakt som en for each loop). All hjälp uppskattas enormt mycket !!

Laguna Online 28457
Postad: 29 okt 2021 12:28

Det är alltid vanskligt att iterera över nån sorts lista och modifiera listan medan man gör det. Det är inte uppenbart vad man vill ska hända, så det brukar antingen vara något annat än man vill, eller vara odefinierat, dvs. den som tillhandahåller iteratorn garanterar inte vad som händer.

Ett sätt är att göra en kopia av listan och iterera över den, ett annat att använda index i stället för en iterator, så man har kontroll över vad som händer.

Slå upp iteratorfunktionen för språket och kolla vad som sägs om att modifiera listan medan man itererar. Den kanske gör något som är användbart.

Fermatrix 7841 – Fd. Medlem
Postad: 29 okt 2021 12:46

Hur har du placerat dina if-satser? ingenting är indenterat så det är svårt att följa.

Men tänk på att apple innehåller p, så att du kommer först gå igenom if(word.startsWith...)

iter.remove();

och sedan kommer du kolla fallet om den innehåller "e".

Laguna Online 28457
Postad: 29 okt 2021 12:53

Jag tittade inte så noga på koden, faktiskt, för den var svårläst. Du kollar på "e" bara om ordet börjar på "p", så den ser aldrig "apple" där.

sampledragon5 495
Postad: 29 okt 2021 13:14

Tack! nu fattar jag iallafall varför apple samt banana varken raderas eller medför att loopen breakar. Men vad är det som händer då lokal variabeln "word" refererar till string objektet "plum" ? i första if statement så börjar objektet "plum" på p dvs "plum" invokes den första if statement. I den första if statements body så åberopas metoden remove ( dvs så raderas "plum"). När plum raderas, blir då "word" lika med inget objekt? eller blir word lika med nästa objekt i variablen "fruit" dvs peach ? För isåfall så kommer väll loppen att breaka då under remove metoden befinner sig den andra if statement som säger att om objektet innehåller e ( vilket peach gör ) så ska loopen breaka. Kvar i fruit blir alltså alla frukter förutom plum ( men svaret är att två objekt kommer att raderas i fruit vilket är plum OCH peach.... varför raderas peach ? Tack ännu en gång för hjälpen !!!!

Lindehaven 820 – Lärare
Postad: 29 okt 2021 13:49

Även om "plum" raderas från variabeln fruit, så behåller variabeln word värdet "plum". Eftersom "plum" inte innehåller något "e" så fortsätter iterationen.

Variabeln word behåller sitt värde tills dess det får ett nytt värde med String word = iter.next();

Även om "peach" sedan raderas från variabeln fruit, så behåller variabeln word värdet "peach". Eftersom "peach" innehåller ett "e" så bryts iterationen.

Med spårutskrifter på väl valda ställen i koden så ser man detta tydligt:

    List<String> fruit = new ArrayList<>(List.of("apple", "banana", "plum",
                                                 "peach", "pear", "kiwi"));
    Iterator<String> iter = fruit.iterator();
    System.out.println("Before: fruit = " + fruit);
    while (iter.hasNext())
    {
      String word = iter.next();
      if (word.startsWith("p"))
      {
        iter.remove();
        System.out.println(word + " starts with p, so fruit = " + fruit);
        if (word.contains( "e" ) )
        {
          System.out.println(word + " contains e, so break the loop!");
          break;
        }
      }
    }
    System.out.println("After:  fruit = " + fruit);
sampledragon5 495
Postad: 29 okt 2021 14:13

Tack så jätte mycket nu fattar jag !!!!!! 

Svara Avbryt
Close