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 List
s içinde dolaşmak için
get
yöntemi Iterator
bir 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
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.
döngü numaralama üzerinde yineleme içi...
Neden küçük bir liste daha küçük bir d...
Daha iyi bir şekilde iki liste, her yi...
C bir Sözlük üzerinde yineleme için en...
Java nasıl yeni bir Liste yapmak için...