सवाल एक int सरणी में किसी तत्व की अनुक्रमणिका कैसे खोजें?


मैं जावा सरणी प्रकार में किसी निश्चित मान का सूचकांक कैसे प्राप्त कर सकता हूं int?

मैंने उपयोग करने की कोशिश की Arrays.binarySearch मेरी अपरिवर्तित सरणी पर, यह कभी-कभी सही उत्तर देता है।


59
2018-05-30 01:55


मूल


बाइनरी खोज कभी भी एक अनुरक्षित सरणी पर काम नहीं करेगी। - Chris Eberle
तो क्या आप मुझे कुछ सुझाव दे सकते हैं, मुझे यह कैसे करना चाहिए। क्योंकि अगर मैं सरणी को सॉर्ट करता हूं, तो मैं इंडेक्स का ट्रैक खो देता हूं, और मुझे यह जानने की ज़रूरत है कि मूल्य किस सूचकांक से आया था ?? - Jeomark
संपादित करें: मैं जोड़ना भूल गया, मुझे डबल मानों के लिए सरणी अनुक्रमणिका भी ढूंढनी है। - Jeomark
यदि आप सरणी को सॉर्ट नहीं करना चाहते हैं, तो मान को ढूंढने के लिए बस लूप के लिए एक सरल का उपयोग करें। - Jamie Curtis
कार्यों के दस्तावेज़ीकरण को पढ़ने के लिए आम तौर पर अच्छा है :) से binarySearch: "बाइनरी खोज एल्गोरिदम का उपयोग करके निर्दिष्ट मान के लिए निर्दिष्ट सरणी की खोज करता है। सरणी क्रमबद्ध किया जाना चाहिए (इस तरह से कॉल करने से पहले (लंबी []) विधि के अनुसार)। यदि यह क्रमबद्ध नहीं है, तो परिणाम अपरिभाषित हैं। ... "


जवाब:


Integer[] array = {1,2,3,4,5,6};

Arrays.asList(array).indexOf(4);

ध्यान दें कि यह समाधान थ्रेडसेफ है क्योंकि यह प्रकार की सूची का एक नया ऑब्जेक्ट बनाता है।

इसके अलावा आप इसे लूप में या ऐसा कुछ भी नहीं करना चाहते हैं क्योंकि आप हर बार एक नई वस्तु बनायेंगे


106
2018-05-30 01:57



धन्यवाद लेकिन क्या यह डबल टाइप के लिए काम करेगा? क्षमा करें, मैं इस प्रश्न में उल्लेख करना भूल गया, लेकिन मुझे इसे डबल मानों के लिए भी काम करने की ज़रूरत है। हालांकि यह इंक के साथ ठीक काम करता है। - Jeomark
हां यह होगा, आपको कुछ भी बदलने की ज़रूरत नहीं है (लेकिन सरणी प्रकार स्पष्ट रूप से) - Pablo Fernandez
असल में कोड काम नहीं करता है। चेक इंडेक्सऑफ ऑब्जेक्ट को ढूंढने में विफल क्यों है? - teloon
Int [] के बजाय आपको सरणी को इंटीजर [] में परिवर्तित करने की आवश्यकता है। आदिम सरणी autoboxed नहीं हैं। - Leon Helmsley
क्या यह वास्तव में थ्रेडसेफ है? जब मैं स्रोत के माध्यम से क्लिक करता हूं List.asList () एक ArrayList बनाता है जो int सरणी सीधे डेटा कंटेनर के रूप में ले रहा है (प्रतिलिपि नहीं) - Langusten Gustel


यदि आप अमरूद संग्रह का उपयोग कर रहे हैं तो एक और विकल्प है Ints.indexOf

// Perfect storm:
final int needle = 42;
final int[] haystack = [1, 2, 3, 42];

// Spoiler alert: index == 3
final int index = Ints.indexOf(haystack, needle);

अंतरिक्ष, समय और कोड पुन: उपयोग प्रीमियम पर होने पर यह एक बढ़िया विकल्प है। यह भी बहुत terse है।


24
2017-10-13 19:46





पर एक नज़र एपीआई और यह कहता है कि आपको पहले सरणी को सॉर्ट करना होगा

इसलिए:

Arrays.sort(array);
Arrays.binarySearch(array, value);

यदि आप सरणी को सॉर्ट नहीं करना चाहते हैं:

public int find(double[] array, double value) {
    for(int i=0; i<array.length; i++) 
         if(array[i] == value)
             return i;
}

14
2018-05-30 02:01



+1 हालांकि यह ध्यान दिया जाना चाहिए कि Arrays.sort  mutates इनपुट और मूल सरणी संशोधित की जाएगी।
धन्यवाद, दूसरी अनुक्रमणिका ने अलग-अलग इंडेक्स के साथ डुप्लिकेट मानों के लिए कुछ तर्क जोड़ने के बाद मुझे किसी तरह से काम किया। - Jeomark


इस विधि को अपनी कक्षा में कॉपी करें

 public int getArrayIndex(int[] arr,int value) {

        int k=0;
        for(int i=0;i<arr.length;i++){

            if(arr[i]==value){
                k=i;
                break;
            }
        }
    return k;
}

इस विधि को दो पैरामीटर एरे और वैल्यू के साथ कॉल करें और इसके रिटर्न वैल्यू को इंटीजर वैरिएबल में स्टोर करें।

int indexNum = getArrayIndex(array,value);

धन्यवाद


10
2017-12-09 07:54





आप इसे एक सूची में परिवर्तित कर सकते हैं, फिर indexOf विधि का उपयोग करें:

Array.asList(array).indexOf(1); 

http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#asList(T...) http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#indexOf(java.lang.Object)


3
2018-05-30 02:00



यह Arrays है। यानी Arrays.asList (सरणी) .indexOf (1); - Arjun SK


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

public int getIndexOf( int toSearch, int[] tab )
{
  for( int i=0; i< tab.length ; i ++ )
    if( tab[ i ] == toSearch)
     return i;

  return -1;
}//met

मानचित्र में प्रत्येक मान के लिए सभी इंडेक्स को मैप करने का एक वैकल्पिक तरीका हो सकता है।

tab[ index ] = value;
if( map.get( value) == null || map.get( value) > index )
    map.put( value, index );

और फिर सूचकांक प्राप्त करने के लिए map.get (मान)।

सादर, स्टीफन

@pst, आपकी टिप्पणियों के लिए धन्यवाद। क्या आप एक और वैकल्पिक विधि पोस्ट कर सकते हैं?


3
2018-05-30 02:01



यह एक तरीका है, हां। हालांकि यह है नहीं एक ही रास्ता। बुलियन वैरिएबल का उपयोग found यहां बेकार है (और उपयोग नहीं किया गया) और हटा दिया जाना चाहिए। हालांकि "मैन्युअल लूप विधि" दिखाने के लिए एक +1 (स्टाइलिस्ट और फ़ॉर्मेटिंग मुद्दों को अलग करना)।


सरल:

public int getArrayIndex(int[] arr,int value) {
    for(int i=0;i<arr.length;i++)
        if(arr[i]==value) return i;
    return -1;
}

1
2017-08-17 12:34