Frage

Wenn ich JDK5 wie unter

ArrayList<Integer> list = new ArrayList<Integer>();  
     for (Integer i : list) { 

      //cannot check if already reached last item

   }

auf der anderen Seite, wenn ich nur ein Iterator

ArrayList<Integer> list = new ArrayList<Integer>();
  for (Iterator i = list.iterator(); i.hasNext();) {

          //i can check whether this is last item
          if(i.hasNextItem()){
          }

    }

Wie kann ich überprüfen, ob ich bereits im letzten Artikel mit for (Integer i : list) {

erreicht habe
War es hilfreich?

Lösung

Eine Möglichkeit, das zu tun ist, einen Zähler zu verwenden:

ArrayList<Integer> list = new ArrayList<Integer>();
...
int size = list.size();
for (Integer i : list) { 
    ...
    if (--size == 0) {
        // Last item.
        ...
    }
}

Bearbeiten

Wie auch immer, als Tom Hawtin sagte, ist es manchmal besser, die „alte“ Syntax zu verwenden, wenn Sie die aktuellen Indexinformationen benötigen, durch eine for Schleife oder die iterator verwenden, da alles, was Sie gewinnen, wenn die Java5 Syntax wird in der Schleife verloren selbst ...

for (int i = 0; i < list.size(); i++) {
    ...

    if (i == (list.size() - 1)) {
        // Last item...
    }
}

oder

for (Iterator it = list.iterator(); it.hasNext(); ) {
    ...

    if (!it.hasNext()) {
        // Last item...
    }
}

Andere Tipps

Manchmal ist es einfach besser einen Iterator zu verwenden.

(Angeblich soll „85%“ der Anforderungen für einen Index in der noblen for-Schleife ist eine String zur Implementierung Joinmethode (die Sie ohne leicht tun).)

Die API unterstützt nicht, dass direkt. Sie können mit der für (int i ..) Schleife und count die Elemente oder verwenden Sie Unterlisten (0, Größe - 1) und handhabt das letzte Element explizit:

  if(x.isEmpty()) return;
  int last = x.size() - 1;
  for(Integer i : x.subList(0, last)) out.println(i);
  out.println("last " + x.get(last));

Dies ist nur sinnvoll, wenn es keine Redundanz einführen wird. Es eine bessere Leistung als die Zählung Version (nach dem subList Aufwand abgeschrieben wird). (Nur für den Fall betreut Sie nach dem Boxen sowieso).

Ein andere Art und Weise können Sie ein Passthrough-Objekt verwenden, den letzten Wert zu erfassen und dann etwas mit ihm:

List<Integer> list = new ArrayList<Integer>();
Integer lastValue = null;
for (Integer i : list) {
    // do stuff
    lastValue = i;
}
// do stuff with last value
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top