Yineleyici ve Listiterator arasındaki fark nedir?


138
Iterator ite = Set.iterator();
Iterator ite = List.iterator();

ListIterator listite = List.listIterator();

IteratorA Setveya a Listveya a arasında geçiş yapmak için kullanabiliriz Map. Ama ListIteratorsadece a'yı geçmek için kullanılabilir, a'yı Listgeçemez Set. Neden?

Temel farkın, yineleyici ile sadece bir yönde ListIteratorseyahat edebileceğimizi, ancak her iki yönde de seyahat edebileceğimizi biliyorum. Başka farklar var mı? Ve ListIteratorüzerinde herhangi bir avantajı Iterator?


Peters yanıtı ek olarak orada tüm güzel örnekleri ile yineleyiciler hakkında java düşüncesinde bir bölüm okumanızı tavsiye ederim
karınca

Yanıtlar:


150

Farklılıklar ListIterator için Javadoc'da listelenir

Yapabilirsin

  • geriye doğru yineleme
  • herhangi bir noktada yineleyici elde edin.
  • herhangi bir noktada yeni bir değer ekleyin.
  • bu noktada yeni bir değer belirleyin.

68
Ve bunu a ile yapamamanızın nedeni Setbasittir: "Geçerli nokta" yoktur: Öğelerin dizini yoktur ve başka bir öğeyi "önce" veya "sonra" eklemenin yararlı bir yolu yoktur.
Joachim Sauer

Lawrey @Peter herhangi bir noktada endeksi elde o yöntemleri hakkında mı - previousIndex () ve nextIndex () ?
gstackoverflow

2
@gstackoverflow check java.util.List # listIterator (int)
kilonet

4
@ kilonet herhangi bir noktada endeksi elde etmek yerine, karışıklığı önlemek için "herhangi bir noktada yineleyici elde etmek" gibi ifade edilmelidir?
Shailesh Pratapwar

39

İki fark vardır:

  1. Set ve List arasında geçiş yapmak ve Nesnelerin Harita tipini değiştirmek için Yineleyici kullanabiliriz. Bir ListIterator liste türü nesneler arasında geçiş için kullanılabilir, ancak Nesne kümesi türü için kullanılamaz.

    Yani, Set ve List'i kullanarak bir Iterator nesnesi alabiliriz, buraya bakın:

    Iterator kullanarak öğeleri yalnızca Toplama Nesnesi'nden ileri yönde alabiliriz.

    Yineleyici Yöntemler:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Ancak ListIterator nesnesini yalnızca Liste arabiriminden alıyoruz, buraya bakın:

    burada bir ListIterator her iki yönde (hem ileri hem de geri) hareket etmenizi sağlar. O gibi iki yöntemleri vardır Yani hasPrevious()ve previous()Yineleyiciyi dışındaki. Ayrıca, sonraki veya önceki öğelerin dizinlerini alabiliriz ( sırasıyla nextIndex() ve kullanarak previousIndex())

    ListIterator'da Yöntemler:

    1. hasNext ()
    2. Sonraki()
    3. önceki()
    4. hasPrevious ()
    5. Kaldırmak()
    6. nextIndex ()
    7. previousIndex ()
    ListIterator listiterator = List.listIterator();

    Yani, SetIterator nesnesini Set arabiriminden alamıyoruz.

Referans: - Iterator ve ListIterator arasındaki fark nedir?


39
Kirankumarjava.blogspot.com/2013/06/… ' dan büyük ölçüde kesilmiş ve yapıştırılmış gibi görünüyor . Orijinal yazarı daima kabul etmelisiniz.
Cameron Skinner

25

Yineleyici ListIterator'ın süper sınıfıdır.

Aralarındaki farklar:

  1. İle iteratorsadece ileri hareket edebilirsiniz, ancak ListIteratoröğeleri okurken de geri kelime taşıyabilirsiniz.
  2. İle s ListIteratorile mümkün olmayan herhangi bir noktada indeks elde edebilirsiniz iterator.
  3. İle iteratorsadece bir sonraki öğeyi listiteratorkontrol edip edemeyeceğinizi kontrol edebilirsiniz , ancak içinde önceki ve sonraki elemanları kontrol edebilirsiniz.
  4. İle listiteratorhareket ederken istediğiniz zaman yeni eleman ekleyebilirsiniz. İle mümkün değil iterator.
  5. İle listiteratorhareket ederken mümkün olmayan bir öğeyi değiştirebilirsiniz iterator.

Yineleyici görünüm ve his:

 public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional-->use only once with next(), 
                         dont use it when u use for:each
    }

ListIterator görünümü ve hissi:

public interface ListIterator<E> extends Iterator<E> {
    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove(); //optional
    void set(E e); //optional
    void add(E e); //optional
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.