2010-06-24 17 views
9

मुझे ArrayList के साथ कोई समस्या है। मैं इस तरह ArrayList उपयोग कर रहा हूँ:ArrayList indexOf() गलत इंडेक्स देता है?

private ArrayList<Playlist> mPlaylists; 

जहां प्लेलिस्ट एक वर्ग एक और ArrayList से विरासत में मिली है। मैं निम्न कार्य करें:

p = new Playlist(...some parameters...); 
mPlaylists.add(p); 

बाद में जब मैंने 'पी' का उपयोग सूची में सूचकांक पाने के लिए:

int index = mPlaylists.indexOf(p); 

'1' के एक सूचकांक दिया जाता है, यहां तक ​​कि के निरीक्षण हालांकि सूची स्पष्ट रूप से दिखाती है कि यह सूचकांक '4' है।

क्या कोई जानता है कि यह क्यों विफल रहता है? धन्यवाद।

बीआर। मोर्टेन

संपादित करें: indexOf() के बिना एक ही समस्या है, का उपयोग करते हुए बराबरी():

private int GetIndex(Playlist playlist) { 
    for (int i = 0; i < mPlaylists.size(); i++) { 
     if (mPlaylists.get(i).equals(playlist)) { 
      return i; 
     } 
    } 
    return -1; 
} 

न्यू संपादित करें: यह काम करता है !:

private int getIndex(Playlist playlist) { 
    for (int i = 0; i < mPlaylists.size(); i++) { 
     if (mPlaylists.get(i) == playlist) { 
      return i; 
     } 
    } 
    return -1; 
} 

समाधान: जैसा कि सुझाव दिया गया है, मैंने प्लेलिस्ट क्लास को एन्हर नहीं किया यह ArrayList से, बल्कि एक उदाहरण निजी रूप से रखते हुए। यह पता चला कि मुझे केवल 4 ArrayList तरीकों को लागू करना पड़ा था।

यह चाल है; अब indexOf() सही ऑब्जेक्ट देता है!

सभी योगदानकर्ताओं के लिए धन्यवाद!

+5

mPlaylists.get पर क्या है (1); ? क्या आपने 'प्लेलिस्ट' में 'बराबर() 'ओवरराइड किया है - वहां कुछ भी मज़ाकिया है? –

+0

क्या प्लेलिस्ट ArrayList के indexOf ओवरराइड करता है? –

+1

मेरी प्रारंभिक प्रतिक्रिया यह है कि "आपके पास पी नहीं है जो आप सोचते हैं" उसके बाद "एक पी सोचता है कि यह एक और पी है (या यह नहीं जानता कि यह स्वयं क्या है)"। –

उत्तर

7

डिफ़ॉल्ट ArrayList equals कार्यान्वयन के साथ में गड़बड़ है, क्योंकि जिस तरह से indexOf की तरह कुछ करने के लिए calculated है:

indexOf(Object o) 
    if(o == null) then iterate until null is found and return that index 
    if(o != null) iterate until o.equals(array[i]) is found and return taht index 
    else return -1 
end 

तो, आप अपने .equals विधि के साथ कुछ अजीब कर रहे हैं या अपने में गलती कर रहे हैं सूची में एक और तत्व डालना जब आपको लगता है कि यह अंत में है।

संपादित

अपने संपादित अनुसार ... देखते हैं? आपकी .equals() विधि टूटा हुआ है।

एक अच्छी समीक्षा कर रही है पर विचार करें और सुनिश्चित करें कि यह वर्णन API से Object.equals

+0

+1: मुझे इसे एक मिनट तक मारो –

+0

अपने नए संपादन के अनुसार, आप संदर्भ तुलना कर रहे हैं जो मुझे लगता है कि आप वास्तव में ArrayList को विरासत में नहीं ले रहे हैं।ऐसा लगता है कि आप उस 'प्लेलिस्ट' वर्ग (जैसे अपरकेस विधि नाम yiack का उपयोग करना ...) – OscarRyz

+0

हेहे, हाँ - लेकिन कम से कम अपरकेस विधि नाम का उपयोग करके, मैं नहीं भूलूंगा कि यह केवल एक परीक्षण विधि है , इस समस्या को ट्रैक करने के उद्देश्य से :-) धन्यवाद! –

-1

मुझे यकीन है कि तुम क्यों इस समस्या हो रही है नहीं कर रहा हूँ, लेकिन मैं मैं नए जेनेरिक सूची का उपयोग करने के इस तरह से अपनी सूची बनाने के लिए निर्णय लेंगे, जब मैं तुम्हें थे लगता है: सबसे अधिक संभावना आपके PlayList

List<Playlist> mPlaylists = new List<Playlist>(); 

p = new Playlist(<some parameters>); 
mPlaylists.Add(p); 
+0

में संपादित कर सकता हूं, सूची को तुरंत चालू नहीं कर सकता .. हालांकि वोटों को आज भी वोट नहीं दे सकता ;-) –

+0

ओपी जेनेरिक फॉर्म का उपयोग कर रहा है - बस सूची इंटरफेस नहीं, लेकिन कार्यान्वयन ArrayList। हालांकि पूरी तरह से साफ नहीं है, यह आमतौर पर कक्षा के एक निजी सदस्य के रूप में ठीक माना जाता है। जब आप बस लिखते हैं तो संकलित नहीं होंगे - आप एक सूची को तुरंत चालू नहीं कर सकते - यह एक इंटरफ़ेस है। असाइनमेंट के दाईं ओर 'ArrayList' रखो और यह ठीक रहेगा। – mdma

+0

@ लॉरी - कभी डर नहीं, मेरे पास वोट बाकी हैं> :-) Russ - यह संकलन भी नहीं करेगा, और सवाल का जवाब नहीं देगा। –

1

में परिभाषित का पालन करता है बनाने:

int indexOf(Object o):

निर्दिष्ट की पहली आवृत्ति के सूचकांक रिटर्न इस सूची में तत्व, या -1 यदि इस सूची में तत्व नहीं है। अधिक औपचारिक रूप से, यदि कोई ऐसी अनुक्रमणिका नहीं है तो (o==null ? get(i)==null : o.equals(get(i))), या -1 सबसे कम इंडेक्स लौटाता है।

तो जवाब यह है कि आपको .equals()Playlist में ओवरराइड करने की आवश्यकता है।

1) एक ArrayList में एक से अधिक तत्वों बराबर हैं (के अनुसार विधि के बराबर होती है), तो पहले एक लौटा दिया जाता है:

+0

में मदद करता है, तो उसे यह नहीं करना चाहिए कि वह वास्तव में 'ArrayList' को विरासत में ले रहा है क्योंकि वह विधि उस वर्ग के लिए पहले से ही ओवरराइड है। तो, सुझाव ** ** ** ** इसे फिर से ओवरराइड करने के लिए नहीं होगा (या इसे ठीक से कर रहा है) – OscarRyz

+0

हम्म ... तो मैंने क्या किया; ArrayList से विरासत और बराबर ओवरराइड नहीं() काम करना चाहिए? ... –

0

वहाँ इस व्यवहार के लिए कई कारणों से हो सकता है। हो सकता है कि आपके पास बस कई समान वस्तुएं हों।

2) आपकी प्लेलिस्ट क्लास ArrayList को बढ़ाती है (मुझे यकीन नहीं है कि यह एक अच्छा विचार है)। इसलिए, यदि आपने बराबर विधि को ओवरराइड नहीं किया है, तो तुलना केवल तत्वों के अनुक्रम पर आधारित है। उदाहरण के लिए, किसी भी दो खाली प्लेलिस्ट उदाहरण बराबर माना जाएगा।

3) यदि आप बराबर ओवरराइड करते हैं, तो अपना कार्यान्वयन जांचें। यह एक ही संदर्भ के साथ तुलना के लिए सच होना चाहिए, और आपके मामले में यह नहीं है।

+0

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

+1

@ मॉर्टन प्राइज़: प्लेलिस्ट के अंदर तत्वों का प्रकार क्या था? इस प्रकार के लिए बराबर() कार्यान्वयन क्या था? यदि प्लेलिस्ट में स्ट्रिंग ऑब्जेक्ट्स हैं, तो मैं इस व्यवहार को समझा नहीं सकता। –

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