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]