Iteratoren - LimitIterator und SeekableIterator

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Iteratoren - LimitIterator und SeekableIterator

    Ich lese momentan "professionelle-softwareentwicklung-mit-php5".
    Dort steht:
    Für Mengen, bei denen die Position auf ein bestimmtes Element direkt gesetzt werden kann, bietet sich die Erweiterung der Klasse LimitIterator durch eine Kindklasse an, die zusätzlich die Schnittstelle SeekableIterator implementiert. Als einzige Methode dieser Schnittstelle ist seek($position) zu implementieren. Ein Objekt einer solchen Klasse kann nun effizient an die gewünschte Position springen.
    Quelle: Die Standard PHP Library (SPL)
    Habe ich AFAIK erledigt, doch wie bringe ich den LimitIterator nun dazu, die seek() und nicht die next() Funktion zu nutzen?

    korrigierte Version:
    PHP-Code:
    class Number implements IteratorAggregate
    {
        public 
    $number;
        public function 
    __construct$number )
        {
            
    $this->number preg_replace"#[^0-9]#"""$number );
        }
        public function 
    getIterator()
        {
            return new 
    NumberIterator$this->number );
        }
    }
    class 
    NumberIterator implements IteratorSeekableIterator
    {
        public 
    $number;
        public 
    $i;
        
        public function 
    __construct$number )
        {
            
    $this->number $number;
        }    
        public function 
    rewind()
        {
            
    $i 0;
        }
        public function 
    valid()
        {
            return 
    $this->strlen$this->number );
        }
        public function 
    current()
        {
            return 
    substr$this->number$this->i);
        }
        public function 
    key()
        {
            return 
    $this->i;
        }
        public function 
    next()
        {
            
    $this->i++;
            echo 
    'Iterator::next';
        }
        public function 
    seek$position )
        {
            echo 
    'NumberIterator::seek';
            
    $this->$position;
        }
    }
    $number = new Number"341913412" );
    $numberiterator $number->getIterator();
    $limititerator = new LimitIterator$numberiterator3);
    foreach (
    $limititerator as $key => $value) {
        print 
    $value\n";

    Ausgabe
    Code:
    NumberIterator::seek 9
    Iterator::next 1
    Iterator::next
    Zuletzt geändert von einermeiner; 04.01.2012, 07:45.

  • #2
    Sonst keiner eine Idee?

    Kommentar


    • #3
      doch wie bringe ich den LimitIterator nun dazu, die seek() und nicht die next() Funktion zu nutzen?
      Ist das noch das Problem?
      Dann:
      Das macht der LimitIterator automatisch, wenn der vorgeschaltete Iterator das SeekableIterator Interface implementiert.
      Wir werden alle sterben

      Kommentar


      • #4
        Funktioniert!
        Einfach beim inneren Iterator (Numberiterator) SeekableIterator implementiert und es läuft (habe die berichtigte Version oben eingefügt, falls noch jemand das Problem hat).

        Danke

        Kommentar

        Lädt...
        X