RSS-Feed anzeigen

Landei

Erweiterte For-Schleife mit Index - II

Bewerten
In meinem vorigen Beitrag zum Thema habe ich die Kritik geerntet, dass bei jedem Schleifendurchlauf ein neues Objekt erzeugt werden muss. Folgende Lösung ist ziemlich "hacky", vermeidet aber die Objekterzeugung.

Java Code:
  1.  
  2. import java.util.Iterator;
  3.  
  4. public class IndexedIterable<T> implements Iterable<T> {
  5.  
  6.     private final Iterator<T> iterator;
  7.     private int index = -1;
  8.     private boolean used = false;
  9.  
  10.     public IndexedIterable(final Iterable<T> iterable) {
  11.         iterator = new Iterator<T>() {
  12.             private Iterator<T> delegate = iterable.iterator();
  13.             public boolean hasNext() { return delegate.hasNext(); }
  14.             public T next() { index++;  return delegate.next();  }
  15.             public void remove() { throw new UnsupportedOperationException(); }
  16.         };
  17.     }
  18.  
  19.     @Override
  20.     public Iterator<T> iterator() {
  21.         if (used) {
  22.             throw new IllegalStateException("can't be reused");
  23.         }
  24.         used = true;
  25.         return iterator;
  26.     }
  27.  
  28.     public int getIndex() {  return index; }
  29.  
  30.     public static <T> IndexedIterable<T> indexed(Iterable<T> iterable) {
  31.         return new IndexedIterable<>(iterable);
  32.     }
  33. }

Verwenden kann man die Klasse so:

Java Code:
  1.  
  2. List<String> list =...
  3. IndexedIterable<String> ii = IndexedIterable.indexed(list);
  4. for(String s : ii) {
  5.       System.out.println(ii.getIndex() + ". " + s);
  6. }

Unschön ist, dass man eine IndexedIterable-Variable außerhalb der Schleife braucht, und dass diese nicht wiederverwendet werden darf (sie explodiert dann mit einem kleinen Rauchwölkchen). Diese Nachteile rechtfertigen den Einsatz wohl nur, wenn es um wirklich große Datenmengen und das letzte Quentchen Performance geht.
Stichworte: java
Kategorien
Kategorielos

Kommentare

Kommentar schreiben Kommentar schreiben

Trackbacks