2010-10-22 24 views
6

Göreceli olarak yeni bir Java programcısıyım ve bir ArrayList'ten birden fazla öğe kaldırabiliyorum.Sıralı öğeleri bir Java ArrayList'ten nasıl silebilirim?

ArrayList ar1 = new ArrayList(); 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 

for (int i = 0; i < 2; i++){ 
    ar1.remove(i); 
} 

Ben yineleyici yardımcı olabileceğini düşündüğümüz, ama ben yapmaya çalışıyorum yakın yeterince eşleşen bir örnek bulamıyorum: İdeal böyle bir şey yapmak istiyorum. Herhangi bir yardım takdir edilecektir. Teşekkürler.

cevap

20

Burada yapmak istediğim budur:

ar1.subList(0, 2).clear(); 

Bu da listenin ilk 2 elemanların alt listesini görünüm oluşturur ve orijinal listesinden kaldırmış, o alt listesini temizler. Bu tür şeyler için öncelikle subList yöntemi var ...Listenin belirli bir alanında işlem yapmak. Kaldırmak istediğiniz öğelerin endeksleri biliyorsanız

+0

+1 mükemmel cevap. – aioobe

+0

+1 API dokümanlarının size önerdiği şey budur. (Genellikle birden çok "kaldır" işlevi kadar verimli olmayabilir.) –

+0

OP kaldırmak istediği öğeler ardışık değilse. Ayrıntılara bağlı. –

2

Kaldırılacak ayrı bir nesne listeniz varsa, Collection.removeAll (toRemove) öğesini kullanabilirsiniz. koleksiyonunuzu tabanlı endeksli ise ArrayList gibi

http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

, sen endeksi de eleman çıkarmak için

remove(index) 

çağırabilir. Bunu bir döngüde yapabilirsiniz, ancak çıkarmanın tüm indeksleri başka bir yanıt olarak işaretlediğinden emin olun.

sonra listeden ilk iki öğeleri kaldırmak yapmak isteyen tüm,

list.remove(0); 
    list.remove(0); 

yapmalı edin.

+0

benim hatam çok hızlı okumuş ve engellemeye çalışan sandım iki kopya öğe. removeAll hala bu senaryoda öldürülüyor – Woot4Moo

+0

Ancak 'removeAll 'argümanın içerdiği öğelerin ** tüm oluşumlarını ** kaldıracaktır, yani, ArrayList öğesinin ilk öğelerini kaldırmakla aynı değildir . – aioobe

+0

@aioobe Haklısınız. – hvgotcodes

5

Kesinlikle

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    for (int i = 0; i < 2; i++) { 
     ar1.remove(i); 
    } 
    System.out.println(ar1); 

Sadece ilk elemanını kaldırdıktan sonra, diğer unsurlar değiştirmektedir dikkat yapabilir. Böylece,

'un aranması, listeden birinci ve üçüncü öğeleri etkin bir şekilde kaldıracaktır. Bu da, ilk iki öğe silecektir: endeksli olarak kaldırılması için

ar1.remove(0); 
ar1.remove(0); 
+0

Bu, listede saklanmakta olan şeyin türüne ne şekilde bağlıdır? –

+0

@Stephen Kötü, bazı şeyleri karıştırdım. –

3

bir listeden, geriye doğru saymak gerekir:

for (int i = 1; i >= 0; i--) 

aksi takdirde ilk kaldırma bunun "yukarıdaki" öğeleri kaydırır toplama ve kaldırdığınızı düşündüğünüz öğeleri kaldırmanız gerekmez.

1

Bu deneyebilirsiniz:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
int i = 0; 
while (i < 2 && it.hasNext()) { 
    it.next(); 
    it.remove(); 
    i++; 
} 

Ya da daha genel olarak:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
while (it.hasNext()) { 
    Whatever next = it.next(); 
    if (shouldRemove(next)) { 
     it.remove(); 
    } 
} 

EDIT: Ben özellikle indeksleri veya belirli nesneleri kaldırmak için çalışıyoruz eğer bağlıdır sanırım. Ayrıca, bir şeyin kaldırılması gerektiğine karar vermeniz gereken mantığa da bağlıdır. Endeksleri biliyorsanız, bunları ters sırada kaldırın. Kaldırılacak bir Nesneniz varsa, removeAll'ı kullanın. Listede yinelemek ve bir yüklemle eşleşen nesneleri kaldırmak istiyorsanız yukarıdaki kodu kullanın.

+1

Ah, evet. Sağol Erick. StackOverflow gerçekten cevap bölmesinde yerleşik bir derleyiciye ihtiyaç duyar, bu yüzden kodumuzu test edebiliriz :) –

2

, sen kayması endeksler konusunda endişelenmeden, ters sırada bunları kaldırabilirsiniz:

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    int[] indexesToRemove = {0,2,3}; 
    Arrays.sort(indexesToRemove); 
    for (int i=indexesToRemove.length-1; i>=0; i--) { 
     ar1.remove(indexesToRemove[i]); 
    } 
İlgili konular