2010-08-26 18 views
12

Kaldırmak istediğim bir dizi öğe içeren bir ArrayList'im var. Başka bir listede saklanan öğelerin kimlikleri var. Aşağıdaki kod trivially çalışması gerekir düşündüm, ama nedense, remove() çağrıları yanlış bir değer dönüyor: get() çağrısı da yanlış bir değer döndürdü eğerNeden ArrayList.remove (id) çağrısı çalışmıyor?

ArrayList<Integer> toRemove = new ArrayList<Integer>(); 
    ArrayList<JCheckBox> al = new ArrayList<JCheckBox>(); 

    /* Code that adds a bunch of items to al, and a few integers to toRemove */ 

    System.out.println("Size before removing: " + al.size()); 
    for (int i = toRemove.size() - 1; i >= 0; i--) { 
    System.out.println("Removing id: " + toRemove.get(i) + ": "); 
    System.out.println(al.get(toRemove.get(i))); 
    System.out.println(al.remove(toRemove.get(i))); 
    } 
    System.out.println("Size after removing: " + al.size()); 

anladım istiyorum, ama aslında söz konusu nesneyi döndürür. Burada neyi özlüyorum?

Yukarıdaki kod çıkışı:

Size before removing: 3 
Removing id: 2: 
javax.swing.JCheckBox[...] 
false 
Size after removing: 3 
+0

'al' ve 'toRemove' için doğru bildirimleri yayınlayabilir misiniz? –

+0

İstenen tanımları gönderildi. – zigdon

cevap

31

Benim tahminim get() sadece int alırken remove(), int ve Object hem aşırı gerçeği ile ilgili bir sorun yaşıyorsanız olduğunu. remove(toRemove.get(i).intValue())'u deneyin. AbstractCollection den

remove(Object) Listede arama ve olmayacak verilen nesneyi kaldırmak bunu bir Integer gönderiyor çünkü liste sadece JCheckBox s sahiptir olacaktır. remove(int)'u aramaya çalışıyorsunuz, ancak ona bir Integer veriyorsunuz, bunun yerine Nesne aşırı yükleme çağrılıyor. Integer, bir int dönüştürerek, bu sorunu önlemek için ,

Ayrıca, her zaman için , her zaman her zaman, dizine eşit olduğundan emin olabilir misiniz? Eğer toRemove en az siparişte değilse, olmayacaktır.

+0

Teşekkürler - işe yaradı! Ve evet, toRemove'u inşa ettiğimde, eminim sırayla, yani ters sıraya geçtiğimde, elementler kaldırılırken indeksleri ayarlamanıza gerek yok. – zigdon

+0

Bu cevap 'NULL' nesnesini göz önünde bulundurmuyor – Salman

+0

@Salman Soru, 'null' olmadığı anlamına gelir. Eğer bir 'null' varsa, 'remove()' çağrısının üzerindeki satır, argümanı 'get()' çağrısına çıkarırken boş bir işaretçi atardı. – ILMTitan

1

Kodunuzda iki sorun var. İlk olarak, yanlış "toRemove" yöntemi çağrılıyor. "ToRemove.get (i)" aradığınızda, dönüş değeri bir int yerine bir java.lang.Integer dosyasına otomatik olarak kaydedilir. Bu nedenle, java.util.List # remove (Object) yerine java.util.List # remove (int) çağrılır. Bir Tamsayı nesnesini kaldırmaya ve yanlış döndürmeye çalışıyor. Tamsayı'yı int'ye yazarsanız, istenen yöntem çağrılır.

İkinci sorun: listenin bir öğesinin her kaldırılmasında, sonraki tüm öğelerin dizinleri değişir, çünkü bu öğeler "kaydırılır". Bunu aşmanın birkaç yolu var. Birincisi, indeks listenizi azalan düzende sıralamaktır. Bir diğeri ise bir dizi dizin kullanmak, yeni bir dizi oluşturmak ve yeni diziye sadece dizini kümede olmayan öğelere kopyalamaktır.

İlgili konular