Iterator

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Návrhový vzor Iterator zajišťuje možnost procházení prvků bez znalosti jejich implementace. Lze implementovat pomocí pole nebo jiných datových struktur. Pomocí datové struktury ArrayList je implementace daleko snazší.

Implicitní iterátory[editovat | editovat zdroj]

Některé objektově orientované jazyky jako Perl, Python, C#, Ruby a pozdější verze Javy a Delphi poskytují vlastní způsob jak iterovat elementy obsahující objekty nebo primitivní datové typy bez explicitního vytvoření iterátoru. V tomto případě iterátor není přístupný pro ostatní kód, ale lze k němu přistoupit v dané posloupnosti elementů.

Implicitní iterátory jsou často označovány jako "foreach" a tento styl procházení elementů se také někdy nazývá "vnitřní iterace". Takto vypadá implicitní iterace v programovacím jazyce Python:

for value in iterable:
    print value

Jiný případ je v jazyce Ruby, tam si může objekt vytvořit kolekci sám sobě:

iterable.each do |value|
  puts value
end

Implementace iteratoru v jazyce Java[editovat | editovat zdroj]

V ukázce jsou osoby a jejich kolekce. Kolekce obsahuje vnitřní třídu s názvem PersonIterator, pomocí které ji můžeme celou procházet. Třída PersonIterator implementuje rozhraní Iterator, které obsahuje metody hasNext();(zjistí jestli je v kolekci další osoba) a getNext();(získá další osobu v kolekci). V této ukázce je kolekce implementována pomocí datové struktury ArrayList.

import java.util.ArrayList;
 
public class Main {
 
    public static void main(String[] args) {
        //použití 
        Person per1 = new Person("Jakub", 20);
        Person per2 = new Person("Lukáš", 21);
        Person per3 = new Person("Filip", 30);
        Person per4 = new Person("Honza", 35);
 
        PersonCollection perCol = new PersonCollection();
 
        perCol.add(per1);
        perCol.add(per2);
        perCol.add(per3);
        perCol.add(per4);
 
        Iterator myIt = perCol.Iterator();
 
        while (myIt.hasNext()) {
            Person p = myIt.getNext();
            System.out.println("Jméno: " + p.getName());
            System.out.println("Věk: " + p.getAge());
            System.out.println("---------------------------------");
        }
    }
}
 
class Person {
 
    private String name;
    private int age;
 
    Person(String _name, int _age) {
        this.name = _name;
        this.age = _age;
    }
 
    public String getName() {
        return this.name;
    }
 
    public int getAge() {
        return this.age;
    }
}
 
interface Iterator {
 
    public boolean hasNext();
    public Person getNext();
}
 
class PersonCollection {
 
    @SuppressWarnings("unchecked")
    private ArrayList<Person> persons = new ArrayList();
 
 
    public PersonIterator Iterator() {
        return new PersonIterator();
    }
 
    public void add(Person per) {
        this.persons.add(per);
    }
 
    private class PersonIterator implements Iterator {
        private int current = 0;
 
        public boolean hasNext() {
            if (current == persons.size()) {
                return false;
            } else {
                return true;
            }
        }
 
        public Person getNext() {
            return persons.get(current++);
        }
    }
}

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]