2010-10-18 20 views
5

के आकार में कमी नहीं कर रहा है मेरे पास कुछ डेटा स्टोर करने के लिए एक ऐरेलिस्ट है, लेकिन जब भी मैं सूची से कोई आइटम हटा देता हूं, तो आकार घटता नहीं है, भले ही मैं ArrayList.trimToSize() को कॉल करता हूं । यह मुझे nullPointerExceptions का कारण बन रहा है।जावा ArrayList.remove() ArrayList

मैं एक ऐरेलिस्ट से एक आइटम कैसे हटा सकता हूं और सूची का आकार() तदनुसार घटता है?

संपादित करें: ठीक है, यहां कोड है। यहां कुछ पृष्ठभूमि है जिसे आपको जानना होगा, क्योंकि मैं सभी कोड पोस्ट नहीं कर सकता हूं। मेरे पास _dataHeap नामक एक ऐरेलिस्ट है और _ हैटामैप नामक हैश मैप है। ArrayList एक बाइनरी हीप है जिसमें एक "खोजने योग्य" ऑब्जेक्ट होता है, जिसमें एक कुंजी होती है। हैश मैप ArrayList में ऑब्जेक्ट की अनुक्रमणिका से कुंजी से बांधता है। कतार में ऐसा कोई आइटम हैश मैप का उपयोग करके या एररेलिस्ट का उपयोग कर इंडेक्स द्वारा आइटम द्वारा पाया जा सकता है। कुंजी किसी भी वस्तु हो सकती है, जब तक यह कतार में प्रत्येक आइटम के लिए अद्वितीय है।

मैंने लाइन से इस लाइन को डीबग किया है, और हीप में वस्तु है, यहां तक ​​कि हैशकोड तक भी। समस्या यह है कि वस्तु को कभी भी ArrayList से हटाया नहीं जा रहा है। इसका मतलब यह होना चाहिए कि _dataMap.get (element.getKey()) यह इंगित नहीं कर रहा है कि यह कहां होना चाहिए। मैंने इसे जांच लिया है, हालांकि, मैंने अपने कार्यान्वयन के बाहर एक टेस्ट ऑब्जेक्ट का उपयोग किया है जो एक स्ट्रिंग से एक कस्टम ऑब्जेक्ट में स्ट्रिंग के साथ स्ट्रिंग के साथ नक्शा करता है।

मैं स्ट्रिंग "एक" के साथ अपनी कुंजी के रूप में एक वस्तु बना देता हूं। मैं इसे सम्मिलित करता हूं, फिर इसे हटाने का प्रयास करें। मैंने इस के माध्यम से कदम रखा है, और सबकुछ बाहर निकलता है, एक चीज़ को छोड़कर: ऑब्जेक्ट को कतार से कभी नहीं हटाया जाता है। यह वही हैशकोड, वही कुंजी, सबकुछ मिला है। यह मानचित्र से ठीक हो जाता है, लेकिन ArrayList से नहीं।

public T remove(T element) { 
    //We'll need this data to return the proper value 
    T t = _dataHeap.get(_dataMap.get(element.getKey())); 
    /* 
    * this Swap() call is used to swap our target with the end 
    * of the arraylist. This means that whenever we remove it, 
    * we don't have a change in indexes of the other nodes. 
    * After that, we downHeapify() to fix the whole graph back 
    * to it's functional state. 
    */ 
    swap(_dataMap.get(element.getKey()),length()-1); 
    //Remove from the Heap 
    _dataHeap.remove(_dataMap.get(element.getKey())); 
    _dataHeap.trimToSize(); 
    //Remove from the Map 
    _dataMap.remove(element.getKey()); 
    downHeapify(); 
    return t; 

मुझे आशा है कि यह आप मैं गलत क्या कर रहा का एक बेहतर विचार देता है:

यहाँ निकालें विधि है।

दूसरा संपादित करें: पवित्र बकवास मैंने आखिरकार इसे ठीक कर दिया! मैंने _dataHeap.get (element.index) को अपने स्वयं के चर में खींच लिया। वह सब कुछ हल हो गया!

+0

क्या आप जिस कोड का उपयोग कर रहे हैं उसे पोस्ट कर सकते हैं? – highlycaffeinated

+4

आपको 'trimToSize()' को कॉल करने की आवश्यकता नहीं है, और 'हटाएं() '_should_ सूची के आकार को सही तरीके से अपडेट करें। शायद आप एक [एसएससीसीई] (http://sscce.org/) पोस्ट कर सकते हैं जो समस्या को दर्शाता है? –

उत्तर

4

मुझे लगता है जैसे आप वास्तव में कुछ भी नहीं हटा रहे हैं। आपके remove कॉल का वापसी मूल्य क्या है?

यदि आप remove(int) का उपयोग कर रहे हैं तो वापसी मूल्य गैर-शून्य होना चाहिए। यदि remove(Object) का उपयोग कर रहे हैं, तो परिणाम सही होना चाहिए। अन्यथा आपने वास्तव में कुछ भी नहीं हटाया है। एक तत्व को हटाने का प्रयास जो अस्तित्व में नहीं है, कोई त्रुटि नहीं है, केवल शून्य या झूठी लौटाता है।

+0

आप वहां कुछ भी हो सकते हैं। मैंने अभी जांच की है और पहले हटाने के बाद ArrayList.contains (आइटम) की छपाई के साथ ... और दोनों झूठे हैं। किसी भी तरह से यह सूची में सही नहीं जोड़ रहा है। – digiholic

+1

तो आप वास्तव में कुछ भी नहीं हटा रहे हैं। या तो माइक सही है और आप एक कस्टम क्लास पर 'बराबर' को ओवरराइड करना भूल गए हैं, या जिस ऑब्जेक्ट को आप निकालने का प्रयास कर रहे हैं उसे अभी भी जोड़ा नहीं गया है (या पहले से ही हटा दिया गया था)। –

6

जैसा कि बेमेस ने कहा था, जांचें कि आपके द्वारा इरादे जाने पर कार्य हटाएं या नहीं। मैं पैसे शर्त लगाता हूं कि जिस वस्तु को आप लिख रहे हैं उस पर आपकी बराबर() विधि काम नहीं करती है, आप इसे कैसे उम्मीद करेंगे, क्योंकि आपने इसे ओवरराइड नहीं किया है।

इसके अलावा, बराबर ओवरराइड करने के बाद, हैशकोड को ओवरराइड करने के लिए भी ध्यान रखें। जब आपका ऑब्जेक्ट हैश मैप्स के साथ काम नहीं करता है तो यह आपको एक SO प्रश्न बचाएगा। :)

एक टिप: JUnit का उपयोग करने में देखें। यह पानी से बाहर इन छोटी त्रुटियों को उड़ा देगा, जिससे यह आपके लिए स्पष्ट हो जाएगा जब कुछ काम नहीं कर रहा है कि आप कैसे उम्मीद करेंगे। अपने सुंदर हरे रंग की बार पर एक उज्ज्वल लाल स्थान को अनदेखा करना बहुत मुश्किल है।

+3

पुन: बराबर और हैशकोड को ओवरराइड करना, इसे पढ़ना चाहिए: http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java –

+0

ठीक है, मैंने अभी बराबर और हैशकोड बदल दिया है, लेकिन अभी भी एक समस्या है । मैं इसे समय में नहीं समझ सकता, इसलिए मैं इसे हटाने के बजाय इसे तुरंत ठीक करने जा रहा हूं, मैं इसे शून्य से बदल दूंगा, और निष्पादन से पहले नल की जांच करूंगा। – digiholic

+0

कुछ कोड पोस्ट करें। हम शायद इसे जल्दी से हल कर सकते हैं। – Mike