SORU
12 NİSAN 2010, PAZARTESİ


Bir&; sonsuz quot&; yineleyici kötü tasarım " mı?

Bu genel olarak kötü uygulama Iterator Bu uygulamaları sağlamak""; yani nereden hasNext() (*) doğru geri dönün çağrıları? sonsuzdur

Genellikle derdim ki "Evet" çünkü telefon kodu olabilir kararsız davranır, ama aşağıda uygulama hasNext() döndürür true sürece arayan kaldırır tüm elemanları Listesi yineleyici oldu başlatıldığını ile; yanifesih bir durum var. Bu Iterator meşru bir kullanımı olduğunu düşünüyor musunuz? Bir sezgisel olmayan bir şeydi söyleyebiliriz sanırım halde sözleşmeyi ihlal etmiyor.

public class CyclicIterator<T> implements Iterator<T> {
  private final List<T> l;
  private Iterator<T> it;

  public CyclicIterator<T>(List<T> l) {
    this.l = l;
    this.it = l.iterator();
  }

  public boolean hasNext() {
    return !l.isEmpty();
  }

  public T next() {
    T ret;

    if (!hasNext()) {
      throw new NoSuchElementException();
    } else if (it.hasNext()) {
      ret = it.next();
    } else {
      it = l.iterator();
      ret = it.next();
    }

    return ret;
  }

  public void remove() {
    it.remove();
  }
}

(Bilgiçlik taslayan) DÜZENLEYİN

Bazı insanlar Iterator bir Fibonacci dizisi gibi sınırlandırılmamış bir dizi değerleri oluşturmak için kullanılan olabilir nasıl yorumladı. Ancak, Iterator Java belgelerine bir Yineleyici olduğunu belirtir:

Bir koleksiyon üzerinde bir yineleyici.

Şimdi iddia bu Fibonacci dizisi ise sonsuz bir koleksiyon ama Java isterim eşit koleksiyonu ile java.util.Collection arabirimler sunar yöntemleri gibi size() simgeleyen bir koleksiyon olmalı sınırlı. Bu nedenle, sınırsız bir dizi değerler jeneratör Iterator kullanmak yasal mı?

CEVAP
12 NİSAN 2010, PAZARTESİ


Olduğunu düşünüyorumtamamen meşru- bir Iterator sadece bir stream "" boşver. Neden akışı mutlaka sınırlı olmalıdır?

Diğer diller bol (örneğin Scala) sınırsız akışları için inşa kavramı var ve bu tekrarlanır. Örneğin, kullanarak scalaz

scala> val fibs = (0, 1).iterate[Stream](t2 => t2._2 -> (t2._1   t2._2)).map(_._1).iterator
fibs: Iterator[Int] = non-empty iterator

scala> fibs.take(10).mkString(", ") //first 10 fibonnacci numbers
res0: String = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

DÜZENLEME:Az prensibi açısından sürpriz, tamamen içeriğe bağlı bence. Örneğin, ben geri dönmek için bu yöntemi ne beklenir ki?

public Iterator<Integer> fibonacciSequence();

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AutoStream's Garage419

    AutoStream's

    15 EKİM 2007
  • TechShowsYou

    TechShowsYou

    3 Mart 2011
  • The Dubstep FX

    The Dubstep

    5 Mart 2011