Java foreach-Schleife: for (Integer i: Liste) {...}
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) {
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