2010-08-26 18 views
12

मेरे पास एक ऐरेलिस्ट है, जिसमें कई आइटम शामिल हैं जिन्हें मैं निकालना चाहता हूं। मेरे पास अन्य सूची में संग्रहीत करने के लिए आइटम की आईडी हैं। लगा निम्नलिखित कोड तुच्छता से काम करना चाहिए, लेकिन किसी कारण से, निकालें() कॉल एक झूठी मूल्य लौट रहे हैं:मेरा ArrayList.remove (आईडी) कॉल क्यों काम नहीं कर रहा है?

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()); 

मैं समझ गया हैं तो प्राप्त() कॉल भी एक झूठी मान दिया है, लेकिन यह वास्तव में वस्तु को प्रश्न में वापस कर देता है। मुझे यहां क्या समझ नहीं आ रहा है?

उपरोक्त कोड का उत्पादन:

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

क्या आप 'अल' और 'toRemove' के लिए सटीक घोषणाएं पोस्ट कर सकते हैं? –

+0

अनुरोध की गई परिभाषा पोस्ट की गई। – zigdon

उत्तर

31

मेरा अनुमान है कि आप इस तथ्य है कि remove(), int और Object दोनों के साथ ओवरलोड हो गया है, जबकि get() केवल एक int लेता है के साथ एक समस्या हो रही है है। remove(toRemove.get(i).intValue()) आज़माएं।

remove(Object)AbstractCollection से सूची के माध्यम से खोज करेंगे और दिए गए वस्तु है, जो वहाँ नहीं होगा हटाने क्योंकि आप इसे भेज रहे हैं एक Integer और इस सूची में केवल JCheckBox रों है। आप remove(int) पर कॉल करने का प्रयास कर रहे हैं, लेकिन क्योंकि आप इसे Integer दे रहे हैं, ऑब्जेक्ट ओवरलोड को इसके बजाए कहा जाता है। Integer को int में परिवर्तित करके, आप इस समस्या से बचें

साथ ही, क्या आप हमेशा यह सुनिश्चित कर सकते हैं कि आईडी में हमेशा आईडी इंडेक्स के बराबर हो? यदि toRemove कम से कम आदेश में सबसे बड़ा नहीं है, तो यह नहीं होगा।

+0

धन्यवाद - यह काम किया! और हाँ, जब मैं रिमूव का निर्माण करता हूं, मुझे यकीन है कि यह क्रम में है, ताकि जब मैं इसे विपरीत क्रम में ले जाऊं, तो मुझे इंडेक्स को समायोजित करने की आवश्यकता नहीं है क्योंकि तत्व हटा दिए जाते हैं। – zigdon

+0

यह उत्तर 'NULL' ऑब्जेक्ट्स – Salman

+0

@ सलमान पर विचार नहीं करता है प्रश्न का तात्पर्य है कि वहां 'शून्य' नहीं है। यदि कोई 'शून्य' था तो 'निकालें()' कॉल के ऊपर की रेखा बाहरी 'get()' कॉल पर तर्क को अनबॉक्स करते समय एक शून्य सूचक फेंक देगी। – ILMTitan

1

आपके कोड के साथ दो समस्याएं हैं। सबसे पहले, गलत "toRemove" विधि आ रही है। जब आप "toRemove.get (i)" को कॉल करते हैं, तो वापसी मूल्य एक int के बजाय java.lang.Integer में autoboxed है। इसलिए, java.util.List # हटाएं (ऑब्जेक्ट) java.util के बजाय बुलाया जाता है। सूची # हटाएं (int)। यह एक इंटेगर ऑब्जेक्ट को हटाने का प्रयास कर रहा है, और झूठी रिटर्न देता है। यदि आप इंटीजर को int में डालें, तो वांछित विधि लागू की जाएगी।

दूसरी समस्या: प्रत्येक बार जब आप सूची का तत्व हटाते हैं, तो बाद के तत्वों की अनुक्रमणिका बदल जाती है, क्योंकि उन तत्वों को "स्थानांतरित" किया जाता है। इसके चारों ओर जाने के कई तरीके हैं। एक इंडेक्स की सूची को अवरोही क्रम में सॉर्ट करना है। एक और इंडेक्स के एक सेट का उपयोग करना होगा, एक नई सरणी बनाएं, और केवल नए तत्वों में कॉपी करें जिनकी अनुक्रमणिका सेट में नहीं है।

संबंधित मुद्दे