जावा: ArrayList - अगर कोई सूचकांक मौजूद है तो मैं कैसे जांच सकता हूं?


111

मैं उपयोग कर रहा हूं ArrayList<String>और मैं विशिष्ट सूचकांकों में डेटा जोड़ता हूं, अगर कोई विशिष्ट सूचकांक मौजूद है तो मैं कैसे जांच सकता हूं?

क्या मुझे बस get()मूल्य की जांच करनी चाहिए ? या मुझे एक अपवाद की प्रतीक्षा करनी चाहिए? क्या कोई और तरीका है?

अपडेट करें

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


2
एक सेट पर एक नज़र है शायद इसके लिए आपको क्या जरूरत है?
पॉल व्हेलन

3
फिर आप के लिए get()और जाँच करने वाले हैं null- हालांकि अपवाद पर भरोसा नहीं करते। एक के उपयोग पर विचार HashTableके बजाय java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html
Amarghosh

बहुत बढ़िया!! मैं
ufk

जवाबों:


158

सूची में विधि आइटमों की संख्या arrayList.size() लौटाती है - इसलिए यदि सूचकांक इससे अधिक या इसके बराबर है size(), तो यह मौजूद नहीं है।

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}

10
यह "अधिक से अधिक या बराबर होना चाहिए size()" क्योंकि यह एक शून्य-आधारित सूचकांक है।
मैकडोवेल

1
यह भी उल्लेख के लायक है कि इस परमाणु को बनाने के लिए आपको संभवतः सूची को लॉक करते हुए आकार () की जाँच करें और संबंधित सशर्त सूचकांक आधारित लुक-अप करना चाहिए।
अदाम्सकी

3
कृपया ध्यान दें कि मैं इस उत्तर को सही मानता हूं क्योंकि स्वामी (अमरघोष) ने मेरे प्रश्न के उत्तर में मेरे प्रश्न का उत्तर दिया था। हैशटेबल मेरी जरूरतों को बहुत बेहतर करेगा।
ufk

क्या होगा यदि आप आइटम के आईडी के साथ सरणी सूची में आइटम सेट कर रहे हैं? पूर्व। mylist.set (1, आइटम 1); mylist.set (3, आइटम 3); // स्किपिंग 2 मुझे लगता है कि हाशपैप उस परिदृश्य के लिए अधिक उपयुक्त है?
यमन

यह मुझे बहुत संतुष्ट नहीं करता है .. अगर मैं सूची में कुछ करना चाहता हूं यदि सूचकांक पहले से ही है, लेकिन अन्यथा इसे प्रस्तुत करने के लिए .. एक नई सूची के साथ मैं भी शुरू करने जा रहा हूं index = 0और मेरा list.size() == 0भी। इसलिए पहली बार जब मैं जाँच करूँगा तो यह सही होगा और मैं सूची को सामान करने के लिए तैयार करूँगा। लेकिन अगली बार उस सूचकांक में, मेरा सूचकांक अभी भी रहेगा index = 0और अब मैं उस तत्व को सूची में फिर से शुरू कर रहा हूं, जब मुझे सामान करना था। 1 विचार &&दूसरी स्थिति की तरह है, list.get(index) == nullलेकिन यह काम नहीं कर रहा है, इस तरह के सवाल क्यों हैं
रॉबर्टो टोमैस

69

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

यदि आप विभिन्न सूचियों में मैन्युअल रूप से प्रविष्टियाँ जोड़ते हैं, तो इनमें से कोई भी सुझाव काम नहीं करेगा, क्योंकि आपको एक विशिष्ट सूचकांक की जाँच करने की आवश्यकता है।

यदि (list.get (index) == null) का उपयोग करना या तो काम नहीं करेगा, जैसा कि मिलता है () null को वापस करने के बजाय एक अपवाद फेंकता है।

इसे इस्तेमाल करे:

try {
    list.get( index );
} catch ( IndexOutOfBoundsException e ) {
    list.add( index, new Object() );
}

यदि सूचकांक मौजूद नहीं है तो यहां एक नई प्रविष्टि जोड़ी जाती है। आप इसे कुछ अलग करने के लिए बदल सकते हैं।


2
धन्यवाद, यूनिट टेस्टिंग के लिए इस तकनीक की जरूरत है कि क्या सरणी इंडेक्स मौजूद हैं।
नौमेनन

11
try/catchइस तरह के काम के लिए उपयोग करने से बचने के लिए याद रखें , यह आपके कार्यक्रम को 50% या शायद और अधिक धीमा कर देगा .. त्रुटि की जाँच आपके मौजूदा कोड को एक पट्टा की तरह जोड़ता है ताकि यह धीमा हो जाए .. महत्वपूर्ण क्षेत्रों में इससे बचने के लिए बेहतर है। lengthइस मामले में जाँच करना सबसे अच्छी बात है जो आप कर सकते हैं, क्योंकि indexइच्छाशक्ति हमेशा कम होगी length, पुराने indexको स्थानांतरित कर दिया जाएगा और नए बन जाएंगे indexयदि आप removeउन्हें ऐसा करते हैं तो इसीलिए नियम की जाँच lengthहमेशा चलेगी।
SSPoke

1
@SSpoke ... जबकि मैं सहमत हूँ, कोशिश / पकड़ 'एक अच्छा' जवाब से दूर है; यह समस्या है जब सूची विरल है। मैं एक सरणी का उपयोग करने के सुझाव को प्राथमिकता देता हूं: ऑब्जेक्ट [] ऐरी; नीचे या एक हैश।
होगा

12

यह वही चीज़ है जिसकी आपको आवश्यकता है ...

public boolean indexExists(final List list, final int index) {
    return index >= 0 && index < list.size();
}

क्यों नहीं एक पुराने पुराने सरणी का उपयोग करें? सूची में अनुक्रमणित पहुंच एक कोड गंध है जो मुझे लगता है।


3
हमेशा नहीं, क्योंकि वह चाहते हैं कि अर्रेलिस्ट समय के साथ विकसित हो, और यह कि एक सरणी नहीं कर सकती।
कोयोटे

7

आमतौर पर मैं सिर्फ जांचता हूं कि क्या सूचकांक सरणी आकार से कम है

if (index < list.size()) {
    ...
}

यदि आप भी सूचकांक के नकारात्मक मूल्य से चिंतित हैं, तो निम्नलिखित का उपयोग करें

if (index >= 0 && index < list.size()) {
    ...
}

1
यह किसी भी मूल्य को कैसे प्रदान करता है कई साल पहले स्वीकृत उत्तर ?
बेसिल बोर्के

2
मुझे लगता है कि आपके विचार में यह कोई मूल्य प्रदान नहीं करता है, लेकिन मैंने स्वीकार किए गए उत्तर पर रॉबर्टो टोमस की एक टिप्पणी देखी, यह मानते हुए कि वह स्वीकृत उत्तर को काफी नहीं समझता था। इसे बाहर की जाँच करें "मैं एक नई सूची के साथ सूचकांक = 0 और मेरी सूची पर शुरू करने जा रहा हूं। (आकार == = 0 भी। इसलिए पहली बार जब मैं इसकी जांच करूंगा तो यह सच होगा" मैंने मदद करने के लिए एक अलग उत्तर पोस्ट करने का फैसला किया। भविष्य की कोई उलझन।
आमिर

6

आपके अपडेट के बारे में (जो शायद एक और सवाल होना चाहिए)। आपको ArrayList के बजाय इन ऑब्जेक्ट्स की एक सरणी का उपयोग करना चाहिए, ताकि आप बस शून्य के लिए मूल्य की जांच कर सकें:

Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
   // not available
}
else {
   // do something
}

सर्वश्रेष्ठ प्रणालियां

यदि आपके पास आपके सरणी में सौ प्रविष्टियां नहीं हैं, तो आपको इसे जादू की संख्या 3,8 आदि से छुटकारा पाने के लिए एक वर्ग के रूप में व्यवस्थित करने पर विचार करना चाहिए।

अपवाद का उपयोग करके नियंत्रण प्रवाह खराब अभ्यास है।


1
यदि सरणी [8] मौजूद नहीं है, तो आप ArrayIndexOutOfBoundException से मुठभेड़ करेंगे।
नितेश कुमार आनंद

4

चूंकि java-9जाँच का एक मानक तरीका है यदि कोई इंडेक्स सरणी से संबंधित है - ऑब्जेक्ट # चेकइंडेक्स () :

List<Integer> ints = List.of(1,2,3);
System.out.println(Objects.checkIndex(1,ints.size())); // 1
System.out.println(Objects.checkIndex(10,ints.size())); //IndexOutOfBoundsException

of()जावा 9 को क्लास लिस्ट में भी जोड़ा जाता है : docs.oracle.com/javase/9/docs/api/java/util/List.html#of--
Orici

3

आप विधि ArrayListका उपयोग करके आकार की जांच कर सकते हैं size()। यह अधिकतम इंडेक्स +1 लौटाएगा


2

ऐसा करने का एक सरल तरीका:

try {
  list.get( index ); 
} 
catch ( IndexOutOfBoundsException e ) {
  if(list.isEmpty() || index >= list.size()){
    // Adding new item to list.
  }
}

1

एक सूचकांक मौजूद है या नहीं, इसके लिए त्वरित और गंदा परीक्षण। अपनी कार्यान्वयन सूची में अपनी सूची के साथ आप परीक्षण कर रहे हैं।

public boolean hasIndex(int index){
    if(index < list.size())
        return true;
    return false;
}

या 2 डी आयामी सरणी के लिए ...

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}

1
सूची में यह नहीं .lengthहै, list.size()लेकिन यह कोई बड़ी बात नहीं है कि मैं हर समय इस तरह से खराब होता हूं कि मैं उस एक पर मेरा मार्गदर्शन करने के लिए संकलक पर भरोसा करता हूं। आप शायद आदिम सरणियों के बारे में सोच रहे थे
SSPoke

1
उस पकड़ने के लिए धन्यवाद। कंटेनर कार्डिनैलिटी को भूलना आसान हो सकता है।
t3dodson

0

यदि आपका सूचकांक आपकी सूची के आकार से कम है, तो इसका अस्तित्व है, संभवतः nullमूल्य के साथ । यदि इंडेक्स बड़ा है तो आप कॉल कर सकते हैंensureCapacity() उस इंडेक्स का उपयोग करने में सक्षम होने के लिए ।

यदि आप जांचना चाहते हैं कि आपके सूचकांक में कोई मूल्य है nullया नहीं, तो कॉल करेंget()


1
कॉलिंग सुनिश्चितता (int) सूची के आकार में वृद्धि नहीं करेगा, केवल क्षमता; यानी "संभावित आकार" तो सीमा सूचकांक लुक-अप अभी भी विफल रहेगा।
अदाम्सकी

इसके अलावा, सभी पर कॉलसपेसिटी (इंट) क्यों कहें? यह एक अविश्वसनीय रूप से महंगा ऑपरेशन हो सकता है यदि उदाहरण के लिए सूची का वर्तमान आकार 5 है और आप आइटम का मान निर्धारित करना चाहते हैं #: 100,000,000।
अदाम्सकी

मेरा मतलब था कि आकार से कम सूचकांक () हमेशा मौजूद होते हैं, जो कि> = आकार () नहीं होते हैं और कोई भी उनका उपयोग नहीं कर सकता (== कॉल सेट ()) जब तक सूची काफी बड़ी नहीं हो जाती। कॉलिंग सुनिश्चितता वास्तव में पर्याप्त नहीं है, किसी को तत्वों को जोड़कर आकार बदलने की आवश्यकता है।
दिमित्री

वास्तव में क्या सुनिश्चित करता है, इसके बारे में गलत व्याख्या। यह ArrayList आकार के साथ कुछ नहीं करता है।
मोहसिन

0

आप सरणी के आकार की जांच कर सकते हैं।

package sojava;
import java.util.ArrayList;

public class Main {
    public static Object get(ArrayList list, int index) {
        if (list.size() > index) { return list.get(index); }
        return null;
    }

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(""); list.add(""); list.add("");        
        System.out.println(get(list, 4));
        // prints 'null'
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.