Iterator
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]Obrázky, zvuky či videa k tématu Iterator na Wikimedia Commons
- Návrhový vzor iterator