ArrayList में आइटम का सूचकांक खोजने का बेहतर तरीका?


89

एंड्रॉइड ऐप के लिए, मेरे पास निम्न कार्यक्षमता है

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

एक तत्व की स्थिति प्राप्त करने के लिए एक फ़ंक्शन लिखने का "सबसे अच्छा" तरीका है? या जावा में एक फैंसी शमीनी मूल कार्य है जिसका मुझे लाभ उठाना चाहिए?


2
यह कोड त्रुटिपूर्ण है: ==अधिकांश मामलों में गलत परिणामों के उपयोग का परिणाम होगा।

3
याद रखें, आप तार की तुलना '==' से नहीं कर सकते, आपको String.equals (स्ट्रिंग str) का उपयोग करना होगा
MrZander

5
@ मॉरजेंडर यकीन है कि आप उनकी तुलना कर सकते हैं ==... यह सिर्फ तुलना का सही प्रकार नहीं है ;-)

आप बता सकते हैं कि मैं अभी भी जावा के लिए नया हूँ .. String.equalsक्या ===जावास्क्रिप्ट जैसी भाषा में हो सकता है? जैसे। मूल्य और प्रकार के खिलाफ जांच?
जैक्सनक्रे

3
सं == है वस्तु पहचान और इसका मतलब है "एक ही वस्तु है" । (यह विचार आदिम मूल्यों के साथ-साथ संदर्भ प्रकारों के लिए भी सही है, यदि आप मानते हैं कि मूल्य 42 या चार 'x', आदि के साथ केवल एक संख्या है)। Object.equalsएक आभासी विधि है जो सभी ऑब्जेक्ट इंस्टेंस के लिए परिभाषित की जाती है और इसका अर्थ है "समान मूल्य" , जैसा कि सभी वर्ग प्रकार ऑब्जेक्ट का विस्तार करते हैं, और सभी ऑब्जेक्ट-समानता परीक्षणों के लिए उपयोग किया जाना चाहिए । कवर ==बनाम पर कई सवाल हैं Object.equalsऔर यह समझने के लिए एक बहुत महत्वपूर्ण अवधारणा है! उदाहरण के लिए, यह गलत है "hello" == new String("hello"):! रवींद्र!

जवाबों:


192

ArrayListएक indexOf()विधि है । अधिक के लिए एपीआई की जांच करें, लेकिन यहां बताया गया है कि यह कैसे काम करता है:

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() ठीक वही लौटेगा जो आपकी विधि वापस आती है, तेजी से।


3
यह पोस्ट किए गए कोड की तुलना में जटिलता के मामले में "तेज" नहीं है, हालांकि इसे अधिक कुशलता से लागू किया जा सकता है। इसके अलावा, indexOf यहां कुछ अलग तरह से प्रतिक्रिया करेगा: ==अनुक्रमणिका का उपयोग करते समय मूल कोड [गलत तरीके से] का उपयोग करता है equals()

वास्तव में, यह लगभग समान कोड है (कम से कम सन जावा 6 कोड मेरे पास), सिवाय इसके कि वे इसे एक-और शाखा के साथ शुरू करते हैं जो अलग से अशक्त संभालती है।
यशवित

यह पुराने सरणियों और सूची वायर्ड है <> FindIndex () विधि है, लेकिन ArrayList के लिए बीच में एपीआई बदल जाता है: D
boctulus

16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

आउटपुट: सूची सूचकांक: 7

यदि आप H पास करते हैं तो यह 7 वापस आ जाएगा , यदि आप J पास करते हैं तो यह -1 पर वापस आ जाएगा क्योंकि हमने डिफ़ॉल्ट मान को -1 में परिभाषित किया है।

किया हुआ


मैं कैसे कर सकते हैं इस बात का शिकंजा विपरीत, अपने समाधान के लिए अपने इनपुट है एच और आप की स्थिति प्राप्त एच , मान लीजिए अगर मेरे इनपुट के सूचकांक है 7 मैं कैसे है कि सूचकांक के स्ट्रिंग मान प्राप्त कर सकते हैं। थैंक यू
जिमले आब्दी

1
@JimaleAbdi करो अपनेArrayList.get (7)। 7 आपकी स्थिति है।
हिरेन पटेल

6

यदि आपकी Listछँटाई की जाती है और आपकी अच्छी यादृच्छिक पहुँच होती है (जैसा कि ArrayListहोता है), तो आपको ध्यान देना चाहिए Collections.binarySearch। अन्यथा, आपको उपयोग करना चाहिए List.indexOf, जैसा कि अन्य ने बताया है।

लेकिन आपका एल्गोरिथ्म ध्वनि है, fwiw ( ==दूसरों की तुलना में अन्य ने इंगित किया है)।


3

वहाँ वास्तव में एक फैंसी shmancy मूल समारोह जावा में आप का लाभ उठाना चाहिए है।

ArrayList नामक एक आवृत्ति विधि है

indexOf(Object o)

(Http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

आप इसे _categoriesइस प्रकार कॉल कर पाएंगे :

_categories.indexOf("camels")

मुझे एंड्रॉइड के लिए प्रोग्रामिंग के साथ कोई अनुभव नहीं है - लेकिन यह एक मानक जावा एप्लिकेशन के लिए काम करेगा।

सौभाग्य।


1
देशी फ़ंक्शन का अर्थ है C \ C ++ मेरे लिए..बस कहना।
हंटर मैकमिलन

3

जावा एपीआई आपके द्वारा उपयोग किए जा सकने वाले दो तरीकों को निर्दिष्ट करता है: indexOf(Object obj)और lastIndexOf(Object obj)। पहले वाला तत्व का इंडेक्स देता है यदि मिला है, तो -1। दूसरा वाला अंतिम इंडेक्स लौटाता है, जो कि सूची को पीछे की ओर खोजना होगा।


1

सूची इंटरफ़ेस का उपयोग करके सूची में आइटम की स्थिति को खोजने का सबसे अच्छा तरीका है,

उदाहरण के लिए,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

आउटपुट: २


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.