के आकार में कमी नहीं कर रहा है मेरे पास कुछ डेटा स्टोर करने के लिए एक ऐरेलिस्ट है, लेकिन जब भी मैं सूची से कोई आइटम हटा देता हूं, तो आकार घटता नहीं है, भले ही मैं 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) को अपने स्वयं के चर में खींच लिया। वह सब कुछ हल हो गया!
क्या आप जिस कोड का उपयोग कर रहे हैं उसे पोस्ट कर सकते हैं? – highlycaffeinated
आपको 'trimToSize()' को कॉल करने की आवश्यकता नहीं है, और 'हटाएं() '_should_ सूची के आकार को सही तरीके से अपडेट करें। शायद आप एक [एसएससीसीई] (http://sscce.org/) पोस्ट कर सकते हैं जो समस्या को दर्शाता है? –