// Iterator pattern // 1.Obezbediti posebnu klasu "iterator" pridruzenu strukturi podataka //sa kojom se radi:u nasem primeru kolekcija elemenata sa svojstvom "biti paran" // 2.Obezbediti metod createIterator() // 3.Za klasu iteratora napraviti veci broj instanci koje ce nezavisno //"iterirati" (postavljanje na pocetak kolekcije,pomeranje na sledeci element //kolekcije, test da li se doslo do kraja kolekcije,..) //U tu svrhu postoje protokoli:first(), isDone(), next(), currentItem() // 4.Koristeci iterator iz nekog skupa elemata izdvojiti samo clanove zadate kolekcije import java.util.*; class IntSet { private Hashtable ht = new Hashtable(); // 1. Dizajnirati internu "iterator" klasu za kolekciju elemenata public static class Iterator { private IntSet set; private Enumeration e; private Integer current; public Iterator( IntSet in ) { set = in; } public void first() { e = set.ht.keys(); next(); } public boolean isDone() { return current == null; } public int currentItem() { return current.intValue(); } public void next() { try { current = (Integer) e.nextElement(); } catch (NoSuchElementException e) { current = null; } } } public void add( int in ) { ht.put( new Integer( in ), "null" ); } public boolean isMember( int i ) { return ht.containsKey(new Integer(i)); } public Hashtable getHashtable() { return ht; } // 2. "Collection" klasi dodati createIterator() clanicu public Iterator createIterator() { return new Iterator( this ); } } class IteratorPrimer { public static void main( String[] args ) { IntSet set = new IntSet(); //formiranje clana skupa koji zadovoljava neko svojstvo for (int i=2; i < 10; i += 2) set.add( i ); //izdati poruku o pripadnosti broja i skupu(poruka tipa true/false) for (int i=1; i < 9; i++) System.out.print( i + "-" + set.isMember( i ) + " " ); //3. Klijenti zahtevaju objekat kolekcije radi kreiranja vise iterator objekata IntSet.Iterator it1 = set.createIterator(); IntSet.Iterator it2 = set.createIterator(); // 4. Klijenti koriste protokole "iteriranja" : first(), isDone(), next(), currentItem() System.out.print( "\nIterator: " ); for ( it1.first(), it2.first(); ! it1.isDone(); it1.next(), it2.next() ) System.out.print( it1.currentItem() + " " + it2.currentItem() + " " ); //Java ima mogucnost da koristi razlicite obilaske kolekcija poput Enumeration System.out.print( "\nEnumeracija: " ); for (Enumeration e = set.getHashtable().keys(); e.hasMoreElements(); ) System.out.print( e.nextElement() + " " ); System.out.println(); } }