package dk.itu.oop.lecture5; public class CompactNonLetters implements OOPIterator { private OOPIterator in; private boolean packed; // if packed, then head is ".", else head is in.head public CompactNonLetters(OOPIterator in){ this.in = in; packNonLetters(); } private void packNonLetters(){ if ( in.hasNext() ) if ( !isLetter()){ packed = true; while (in.hasNext() && !isLetter() ) in.next(); } else packed = false; else packed = true; } public boolean hasNext(){ return in.hasNext() || packed; } public Object peek(){ return (packed? new Character('.') : in.peek() ); } public Object next(){ Object o = peek(); if (packed) packed = false; else{ in.next(); packNonLetters(); } return o; } private boolean isLetter(){ return Character.isLetter( ( (Character) in.peek() ).charValue() ); } public OOPIterator cloneMe(){ try{ CompactNonLetters clone = (CompactNonLetters)super.clone(); clone.in = in.cloneMe(); return clone; }catch(CloneNotSupportedException e){ return null; } } public static void main(String[] args){ String haddock = "You #!@ Miserable earthworms! Numbskulls! and Carpet-sellers"; OOPIterator itr = new CompactNonLetters(new CharacterIterator( haddock ) ); while (itr.hasNext()) System.out.print( itr.next() ); System.out.println(); } }