जावा का ऐरे इंडेक्सऑफ कहां है?


199

मुझे बहुत स्पष्ट रूप से कुछ याद आ रहा है, लेकिन मैंने सभी को खोज लिया है और इस विधि को नहीं खोज सकता।

जवाबों:


234

Arraysउपयोगिता वर्ग का उपयोग करके इसे पूरा करने के कुछ तरीके हैं ।

यदि सरणी सॉर्ट नहीं है और प्राथमिकताओं का एक सरणी नहीं है :

java.util.Arrays.asList(theArray).indexOf(o)

यदि सरणी प्रधानता है और सॉर्ट नहीं की गई है, तो किसी को अन्य उत्तर जैसे कि केरम बेयोडान्स , एंड्रयू मैककिनेल या मिशाक्स द्वारा प्रस्तुत समाधान का उपयोग करना चाहिए । उपरोक्त कोड भले ही theArrayआदिम हो (संभवत: चेतावनी देते हुए) संकलन करेगा, लेकिन फिर भी आप पूरी तरह से गलत परिणाम प्राप्त करेंगे।

यदि सरणी को क्रमबद्ध किया जाता है, तो आप प्रदर्शन के लिए एक द्विआधारी खोज का उपयोग कर सकते हैं:

java.util.Arrays.binarySearch(theArray, o)

3
मुझे पूरा यकीन है कि यह उत्तर कम से कम जावा 1.6 के लिए गलत है: download.oracle.com/javase/6/docs/api/java/util/… aslist तर्कों की सूची को एक सूची में तब्दील करता है न कि तर्क।
अलेक्जेंड्रू

11
@ अलेक्सांद्रु एलिप्सिस हैंडलिंग सिंटैक्टिक शुगर है। यदि आपके पास कोई तर्क टाइप किया गया है T..., तो वास्तविक रन-टाइम प्रकार का तर्क है T[], और Tउनमें परिणाम प्रकार के शून्य या अधिक मापदंडों को पारित करके एक नवनिर्मित सरणी में लपेटा और पारित किया गया है। यदि पारित किया जा रहा पैरामीटर पहले से ही प्रकार का है T[], तो सिंटैक्टिक चीनी को बाईपास किया जाता है।
जेफरी हंटिन

7
में तुम्हारी बात समझ रहा हूँ। समाधान ( .indexOf) आदिम के लिए मान्य नहीं है, हालांकि।
अलेक्जेंड्रू

53
चूंकि किसी ने उल्लेख नहीं किया है: Arrays.asList बैकिंग के रूप में पहले से मौजूद सरणी का उपयोग करता है। (यानी कॉपी बनने के बारे में कोई चिंता नहीं है।)
जोशुआ गोल्डबर्ग

4
@Notinlist जावा लोगों ने भी यही सोचा। Arrays.toList(list).sublist(from,to).indexOf(o)सीमा के भीतर एक तत्व की खोज करने के लिए उपयोग करें [from, to)
मारियो कार्नेइरो

62

एरे की कोई indexOf()विधि नहीं है।

शायद यह अपाचे कॉमन्स लैंग ArrayUtilsविधि है जिसे आप ढूंढ रहे हैं

import org.apache.commons.lang3.ArrayUtils;

String[] colours = { "Red", "Orange", "Yellow", "Green" };

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");

ग्रहण को यह आयात लाइब्रेरी नहीं मिली।
ओमोर

21

आदिम के लिए, यदि आप मुक्केबाजी से बचना चाहते हैं, तो अमरुद में आदिम सरणियों जैसे कि Ints.indexOf (int [] array, int target) के मददगार हैं।


अन्य समाधान सभी नए तार या सूची बनाते हैं या केवल एकल तत्वों को संभालते हैं। अमरूद का Chars.indexOf आपको एक सरणी में एक सरणी का सूचकांक प्राप्त करने देता है। यह सही उपाय है।
हैप्पीअंगीनर

18

वहां कोई नहीं है। या तो एक का उपयोग करें java.util.List, या आप अपना खुद का लिख ​​सकते हैं indexOf():

public static <T> int indexOf(T needle, T[] haystack)
{
    for (int i=0; i<haystack.length; i++)
    {
        if (haystack[i] != null && haystack[i].equals(needle)
            || needle == null && haystack[i] == null) return i;
    }

    return -1;
}

* आप का उपयोग कर अपने सरणी से एक बना सकते हैं Arrays#asList()


2
उपयोग करना Tभ्रामक है। यह किसी भी प्रकार की सुरक्षा प्रदान नहीं करता है, आसानी से गलती यह सुरक्षित प्रकार है ... बेहतर उपयोग की वस्तु
वेंकट राजू

4
@VenkataRaju, T का उपयोग करके दोनों विधि मापदंडों को एक ही प्रकार का होने के लिए मजबूर करता है। यह उपयोगी है।
गोनैडेरियन

5
@ ओगनडेरियन वास्तव में नहीं है। इन compiles दोनों ठीक: indexOf("str", new Object[] {});,indexOf(new Object(), new String[] {});
वेंकट राजू

1
@VenkataRaju हाँ वास्तव में। आपका उदाहरण कुछ भी साबित नहीं करता है क्योंकि एक स्ट्रिंग एक ऑब्जेक्ट है ... तो जाहिर है एक ऑब्जेक्ट सरणी में एक स्ट्रिंग हो सकती है जिसे आप इंडेक्स ढूंढना चाहते हैं।

1
@ ghert85 एक और उदाहरण: indexOf("str", new Date[] {}),indexOf(new Date(), new String[] {})
वेंकट राजू

15

सी # में विपरीत आप जहां Array.IndexOf विधि, और जावास्क्रिप्ट जहां आप indexOf विधि, जावा के एपीआई ( Arrayऔर Arraysविशेष रूप से वर्ग) ऐसी कोई विधि नहीं है।

इस विधि indexOf (इसके पूरक lastIndexOf के साथ) को java.util.List इंटरफ़ेस में परिभाषित किया गया है। ध्यान दें कि indexOf और lastIndexOf ओवरलोडेड नहीं हैं और केवल एक ऑब्जेक्ट को एक पैरामीटर के रूप में लेते हैं।

यदि आपकी सरणी को क्रमबद्ध किया गया है , तो आप भाग्य में हैं क्योंकि Arrays वर्ग द्विआधारी खोज विधि के ओवरलोड की एक श्रृंखला को परिभाषित करता है जो उस तत्व के सूचकांक को ढूंढेगा जिसे आप ओ (n) के बजाय सर्वोत्तम संभव प्रदर्शन (O (लॉग एन) के साथ देख रहे हैं। ), बाद वाला जो आप अनुक्रमिक द्वारा किए गए अनुक्रमिक खोज से उम्मीद कर सकते हैं)। चार विचार हैं:

  1. सरणी को प्राकृतिक क्रम में या एक तुलनित्र के क्रम में क्रमबद्ध किया जाना चाहिए जिसे आप एक तर्क के रूप में प्रदान करते हैं, या बहुत कम से कम सभी तत्व जो "कम से कम" होते हैं, कुंजी को उस तत्व से पहले आना चाहिए और सभी तत्व जो सरणी में उस तत्व के बाद कुंजी से "बड़ा" होना चाहिए;

  2. परीक्षण आप सामान्य रूप से इंडेक्सऑफ के साथ करते हैं यह निर्धारित करने के लिए कि कोई कुंजी सरणी में है (सत्यापित करें कि रिटर्न वैल्यू -1 नहीं है) बाइनरीसर्च के साथ नहीं है। आपको यह सत्यापित करने की आवश्यकता है कि वापसी मूल्य शून्य से कम नहीं है क्योंकि लौटाया गया मूल्य इंगित करेगा कि कुंजी मौजूद नहीं है, लेकिन यह जिस सूचकांक में मौजूद होगा, उसकी उम्मीद होगी;

  3. यदि आपके सरणी में कई तत्व हैं जो कुंजी के बराबर हैं, तो आपको बाइनरीसर्च से जो मिलता है वह अपरिभाषित है; यह indexOf से अलग है जो पहली घटना को वापस करेगा और lastIndexOf जो पिछली घटना को वापस करेगा।

  4. बूलियन्स की एक सरणी को छाँटा हुआ दिखाई दे सकता है यदि इसमें पहले सभी फ़ाल्स और फिर सभी ट्रूज़ शामिल हैं, लेकिन यह गिनती नहीं करता है। द्विआधारी खोज विधि का कोई ओवरराइड नहीं है जो बूलियंस की एक सरणी को स्वीकार करता है और आपको यह सुनिश्चित करने के लिए कि हे (लॉग एन) प्रदर्शन चाहते हैं तो आपको वहां कुछ चालाक करना होगा, जहां यह पता लगाना है कि सरणी में सरणी का उपयोग करके उदाहरण के लिए पहला सच कहां दिखाई देता है। बूलियन और स्थिरांक बूलियन। FALSE और बूलियन ।TRUE।

यदि आपकी सरणी क्रमबद्ध नहीं है और आदिम प्रकार नहीं है , तो आप java.util.Arrays की asList विधि का उपयोग करके सूची के indexOf और lastIndexOf विधियों का उपयोग कर सकते हैं । यह विधि आपके सरणी के आसपास एक AbstractList इंटरफ़ेस आवरण को वापस कर देगी। इसमें न्यूनतम ओवरहेड शामिल है क्योंकि यह सरणी की एक प्रति नहीं बनाता है। जैसा कि उल्लेख किया गया है, यह विधि अतिभारित नहीं है, इसलिए यह केवल संदर्भ प्रकारों के सरणियों पर काम करेगा।

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

public static int indexOfIntArray(int[] array, int key) {
    int returnvalue = -1;
    for (int i = 0; i < array.length; ++i) {
        if (key == array[i]) {
            returnvalue = i;
            break;
        }
    }
    return returnvalue;
}

यदि आप यहां अपनी खुद की विधि लिखने से बचना चाहते हैं, तो अमरूद जैसे विकास ढांचे से एक का उपयोग करने पर विचार करें। वहां आप indexOf और lastIndexOf का कार्यान्वयन पा सकते हैं ।


11

जावा ArrayListमें एक indexOfविधि है। जावा सरणियों में ऐसी कोई विधि नहीं है।


26
सिर्फ ArrayList- हर जावा के Listपास नहीं है indexOf()
मैट बॉल

6

मुझे अपने लिए कोडिंग के अलावा अन्य सरणियों पर "इंडेक्सऑफ" याद नहीं है ... हालांकि आप शायद कई java.util.Arrays#binarySearch(...)तरीकों में से एक का उपयोग कर सकते हैं ( एर्र्स जेवाडॉक देखें ) यदि आपके सरणी में आदिम प्रकार हैं


5

सूची इंटरफ़ेस में एक indexOf () विधि है, और आप अपने सरणी से सूची को Array के asList () विधि से प्राप्त कर सकते हैं। उसके अलावा, ऐरे के पास ऐसी कोई विधि नहीं है। इसमें सॉर्ट किए गए सरणियों के लिए एक बाइनरीसर्च () विधि है।


4

अरे अपने आप में वह विधि नहीं है। एक सूची, हालांकि, करता है: indexOf


2
सिर्फ ArrayList- हर जावा के Listपास नहीं है indexOf()
मैट बॉल

हाँ, मैंने ArrayList को केवल इसलिए निर्दिष्ट किया क्योंकि ओपी के लिए जो चीज़ सबसे नज़दीकी थी वह हो सकती है :)
इगोर


2

जावा सरणियों में कोई प्रत्यक्ष इंडेक्सऑफ फ़ंक्शन नहीं है।


0

जेफरी हैनटिन का जवाब अच्छा है, लेकिन इसकी कुछ अड़चनें हैं, अगर इसका यह या ऐसा ही है ...

आप अपनी खुद की एक्सटेंशन विधि लिख सकते हैं और यह हमेशा आपके इच्छित तरीके से काम करता है।

Lists.indexOf(array, x -> item == x); // compare in the way you want

और यहाँ आपका विस्तार है

public final class Lists {
    private Lists() {
    }

    public static <T> int indexOf(T[] array, Predicate<T> predicate) {
        for (int i = 0; i < array.length; i++) {
            if (predicate.test(array[i])) return i;
        }
        return -1;
    }

    public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
        for (int i = 0; i < list.size(); i++) {
            if (predicate.test(list.get(i))) return i;
        }
        return -1;
    }

    public interface Predicate<T> {
        boolean test(T t);
    }
}

-4
int findIndex(int myElement, int[] someArray){
 int index = 0;
 for(int n: someArray){
   if(myElement == n) return index;
   else index++;
 }
}

नोट: आप इस विधि का उपयोग प्रकार int के सरणियों के लिए कर सकते हैं, आप इस एल्गोरिथ्म का उपयोग अन्य प्रकार के मामूली बदलावों के लिए भी कर सकते हैं


1
-1: सबसे पहले यह मूल सरणी को क्रमबद्ध करता है जिसे हम नहीं चाहते हैं। दूसरा, यह उत्तर wrt को छांटे हुए सरणी देता है, न कि मूल सरणी जो हम चाहते हैं (यदि हम चाहते हैं कि उत्तर wrt छंटनी हुई सरणी हो, तो यह पहले से ही हल हो जाएगी)। तीसरे के बाद से छँटाई हे (n लॉग एन) यह सिर्फ सरणी के माध्यम से रैखिक रूप से जाने की तुलना में धीमी है। तो यह उत्तर गलत और अक्षम दोनों है।
जेमी

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