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