SORU
23 AĞUSTOS 2013, Cuma


Java bir Liste üzerinde yineleme için yollar?

Olmak da biraz yeni Java dili etmeye çalışıyorum kendimi tanıtmak ile tüm yolları (ya da en azından non-patolojik olanlar) belki biri arasında yineleme bir liste (veya belki de diğer koleksiyonlar) ve avantajları veya dezavantajları her biri.

List<E> list bir nesne verildiğinde, tüm öğeleri döngü için aşağıdaki yolu biliyorum:

Temel for loop (tabii ki, while / do while döngüler eşdeğer de var)

// Not recommended (see below)!
for (int i = 0; i < list.size(); i  ) {
    E element = list.get(i);
    // 1 - can call methods of element
    // 2 - can use i to make index-based calls to methods of list

    // ...
}

@Amarseillan dikkat çekti, bu form kötü bir seçim Olarak not: gerçek uygulaması nedeniyle Lists içinde dolaşmak için get yöntemi Iteratorbir kullanarak kadar etkili olmayabilir. Örneğin, LinkedList uygulamaları gerekir traverse tüm ben elemanları ı-th eleman almak için yukarıdaki. Yukarıdaki örnekte List uygulama için yol yok "onun yerine Kaydet" gelecekteki yinelemeleri daha verimli hale getirmek için. Bir ArrayList aslında bir önemi yok, çünkü karmaşıklığı/maliyet get sabit zaman (O(1)) ise bir LinkedList mı orantılı boyutunu listesi (O(n)). Yerleşik Collections uygulamaları hesaplamalı karmaşıklığı hakkında daha fazla bilgi için this question check out.

Gelişmiş for loop (güzel in this question) açıklanıyor

for (E element : list) {
    // 1 - can call methods of element

    // ...
}

Iterator

for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
    E element = iter.next();
    // 1 - can call methods of element
    // 2 - can use iter.remove() to remove the current element from the list

    // ...
}

DÜZENLEME:Listİterator Ekledi

ListIterator

for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
    E element = iter.next();
    // 1 - can call methods of element
    // 2 - can use iter.remove() to remove the current element from the list
    // 3 - can use iter.add(...) to insert a new element into the list
    //     between element and iter->next()
    // 4 - can use iter.set(...) to replace the current element

    // ...
}

DÜZENLEME:Eklenen "fonksiyonel tarzı" çözüm (teşekkürler Dave Newton)

Functional Java

list.map({E e => e   } // can apply a transformation function for e

Başka yolları da var, eğer varsa ne?

Bu bir yinelenen olmalı gibi hissediyorum, ama ne aradığımı bulabilmiş değilim, bu soru potansiyel olarak gereksiz olduğu için özür dilerim. (BTW, benim ilgi optimize performance; ben sadece bana ne görmek için bir geliştirici olarak istediğiniz için bir arzu kaynaklanıyor.

DÜZENLEME:Önerilen bir cevap ListIterationExample.java taşındı

CEVAP
23 AĞUSTOS 2013, Cuma


Döngü üç formları hemen hemen aynı. for gelişmiş döngü:

for (E element : list) {
    . . .
}

Java Language Specification,. göre ^em>aynıfor geleneksel bir döngü ile bir yineleyici açık kullanım için geçerli. Üçüncü durumda, yalnızca geçerli öğe kaldırarak listesi içeriğini değiştirebilir ve eğer yineleyici remove yöntemi ile yaparsan o zaman sadece kendisi. Dizin tabanlı yineleme, listeyi herhangi bir şekilde değiştirmek için özgürsünüz. Ancak, geçerli dizin önce gelen öğeleri ekleme ve çıkarma döngü elemanları atlama veya aynı öğe işleme birden çok kez zarar verme riskini getirir; böyle bir değişiklik yaptığınızda döngü Endeksi düzgün ayarlamak gerekir.

Her durumda, element gerçek liste öğesi için bir başvuru. Yineleme yöntemleri hiçbiri listede bir şey bir kopyasını yapar. element iç durumu değişiklikleri her zaman listenin ilgili eleman iç durumu olarak görülecektir.

Aslında, orada sadece iki yolu bir liste üzerinde yineleme: bir yineleyici kullanarak bir dizini kullanarak Döngü için geliştirilmiş sadece sözdizimsel bir kısayol Java 5'te açıkça bir yineleyici tanımlama bezginlik önlemek için kullanılmaya başlandı. Her iki stilleri, sana kadar gelebilir aslında önemsiz varyasyonlar kullanarak for, while do while engeller, ama onlar tüm kurutan aynı şey (ya da, daha doğrusu, iki şey).

@İX3 bir yorum belirttiği Gibi, ListIterator bir yineleme gibi bir liste geçerli öğe ayarlamak için kullanabilirsiniz. EDİT: List#iterator() yerine List#listIterator() kullanmak için döngü değişkeni, belli ki, ListIterator Iterator bir yerine bildirilmesi gerekir) başlatmak için gerekir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BruBearBaby

    BruBearBaby

    25 Ocak 2011
  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • snookie77

    snookie77

    2 Mart 2006