जवाबों:
Arrays
उपयोगिता वर्ग का उपयोग करके इसे पूरा करने के कुछ तरीके हैं ।
यदि सरणी सॉर्ट नहीं है और प्राथमिकताओं का एक सरणी नहीं है :
java.util.Arrays.asList(theArray).indexOf(o)
यदि सरणी प्रधानता है और सॉर्ट नहीं की गई है, तो किसी को अन्य उत्तर जैसे कि केरम बेयोडान्स , एंड्रयू मैककिनेल या मिशाक्स द्वारा प्रस्तुत समाधान का उपयोग करना चाहिए । उपरोक्त कोड भले ही theArray
आदिम हो (संभवत: चेतावनी देते हुए) संकलन करेगा, लेकिन फिर भी आप पूरी तरह से गलत परिणाम प्राप्त करेंगे।
यदि सरणी को क्रमबद्ध किया जाता है, तो आप प्रदर्शन के लिए एक द्विआधारी खोज का उपयोग कर सकते हैं:
java.util.Arrays.binarySearch(theArray, o)
T...
, तो वास्तविक रन-टाइम प्रकार का तर्क है T[]
, और T
उनमें परिणाम प्रकार के शून्य या अधिक मापदंडों को पारित करके एक नवनिर्मित सरणी में लपेटा और पारित किया गया है। यदि पारित किया जा रहा पैरामीटर पहले से ही प्रकार का है T[]
, तो सिंटैक्टिक चीनी को बाईपास किया जाता है।
.indexOf
) आदिम के लिए मान्य नहीं है, हालांकि।
Arrays.toList(list).sublist(from,to).indexOf(o)
सीमा के भीतर एक तत्व की खोज करने के लिए उपयोग करें [from, to)
।
एरे की कोई indexOf()
विधि नहीं है।
शायद यह अपाचे कॉमन्स लैंग ArrayUtils
विधि है जिसे आप ढूंढ रहे हैं
import org.apache.commons.lang3.ArrayUtils;
String[] colours = { "Red", "Orange", "Yellow", "Green" };
int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
आदिम के लिए, यदि आप मुक्केबाजी से बचना चाहते हैं, तो अमरुद में आदिम सरणियों जैसे कि Ints.indexOf (int [] array, int target) के मददगार हैं।
वहां कोई नहीं है। या तो एक का उपयोग करें 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()
T
भ्रामक है। यह किसी भी प्रकार की सुरक्षा प्रदान नहीं करता है, आसानी से गलती यह सुरक्षित प्रकार है ... बेहतर उपयोग की वस्तु
indexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
सी # में विपरीत आप जहां Array.IndexOf विधि, और जावास्क्रिप्ट जहां आप indexOf विधि, जावा के एपीआई ( Array
और Arrays
विशेष रूप से वर्ग) ऐसी कोई विधि नहीं है।
इस विधि indexOf (इसके पूरक lastIndexOf के साथ) को java.util.List इंटरफ़ेस में परिभाषित किया गया है। ध्यान दें कि indexOf और lastIndexOf ओवरलोडेड नहीं हैं और केवल एक ऑब्जेक्ट को एक पैरामीटर के रूप में लेते हैं।
यदि आपकी सरणी को क्रमबद्ध किया गया है , तो आप भाग्य में हैं क्योंकि Arrays वर्ग द्विआधारी खोज विधि के ओवरलोड की एक श्रृंखला को परिभाषित करता है जो उस तत्व के सूचकांक को ढूंढेगा जिसे आप ओ (n) के बजाय सर्वोत्तम संभव प्रदर्शन (O (लॉग एन) के साथ देख रहे हैं। ), बाद वाला जो आप अनुक्रमिक द्वारा किए गए अनुक्रमिक खोज से उम्मीद कर सकते हैं)। चार विचार हैं:
सरणी को प्राकृतिक क्रम में या एक तुलनित्र के क्रम में क्रमबद्ध किया जाना चाहिए जिसे आप एक तर्क के रूप में प्रदान करते हैं, या बहुत कम से कम सभी तत्व जो "कम से कम" होते हैं, कुंजी को उस तत्व से पहले आना चाहिए और सभी तत्व जो सरणी में उस तत्व के बाद कुंजी से "बड़ा" होना चाहिए;
परीक्षण आप सामान्य रूप से इंडेक्सऑफ के साथ करते हैं यह निर्धारित करने के लिए कि कोई कुंजी सरणी में है (सत्यापित करें कि रिटर्न वैल्यू -1 नहीं है) बाइनरीसर्च के साथ नहीं है। आपको यह सत्यापित करने की आवश्यकता है कि वापसी मूल्य शून्य से कम नहीं है क्योंकि लौटाया गया मूल्य इंगित करेगा कि कुंजी मौजूद नहीं है, लेकिन यह जिस सूचकांक में मौजूद होगा, उसकी उम्मीद होगी;
यदि आपके सरणी में कई तत्व हैं जो कुंजी के बराबर हैं, तो आपको बाइनरीसर्च से जो मिलता है वह अपरिभाषित है; यह indexOf से अलग है जो पहली घटना को वापस करेगा और lastIndexOf जो पिछली घटना को वापस करेगा।
बूलियन्स की एक सरणी को छाँटा हुआ दिखाई दे सकता है यदि इसमें पहले सभी फ़ाल्स और फिर सभी ट्रूज़ शामिल हैं, लेकिन यह गिनती नहीं करता है। द्विआधारी खोज विधि का कोई ओवरराइड नहीं है जो बूलियंस की एक सरणी को स्वीकार करता है और आपको यह सुनिश्चित करने के लिए कि हे (लॉग एन) प्रदर्शन चाहते हैं तो आपको वहां कुछ चालाक करना होगा, जहां यह पता लगाना है कि सरणी में सरणी का उपयोग करके उदाहरण के लिए पहला सच कहां दिखाई देता है। बूलियन और स्थिरांक बूलियन। 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 का कार्यान्वयन पा सकते हैं ।
मुझे अपने लिए कोडिंग के अलावा अन्य सरणियों पर "इंडेक्सऑफ" याद नहीं है ... हालांकि आप शायद कई java.util.Arrays#binarySearch(...)
तरीकों में से एक का उपयोग कर सकते हैं ( एर्र्स जेवाडॉक देखें ) यदि आपके सरणी में आदिम प्रकार हैं
आप शायद java.util.ArrayList के बारे में सोच रहे हैं , सरणी नहीं।
जेफरी हैनटिन का जवाब अच्छा है, लेकिन इसकी कुछ अड़चनें हैं, अगर इसका यह या ऐसा ही है ...
आप अपनी खुद की एक्सटेंशन विधि लिख सकते हैं और यह हमेशा आपके इच्छित तरीके से काम करता है।
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);
}
}
int findIndex(int myElement, int[] someArray){
int index = 0;
for(int n: someArray){
if(myElement == n) return index;
else index++;
}
}
नोट: आप इस विधि का उपयोग प्रकार int के सरणियों के लिए कर सकते हैं, आप इस एल्गोरिथ्म का उपयोग अन्य प्रकार के मामूली बदलावों के लिए भी कर सकते हैं