2010-07-25 15 views
76

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

मैं यह कैसे कर सकता हूं?

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions [? वहाँ जावा के लिए-प्रत्येक पाश में एक यात्रा-काउंटर तक पहुँचने के लिए एक रास्ता है]/477550/एक-तरफा-से-पहुंच-ए-इटेशन-काउंटर-इन-जावा-फॉर-लूप) – finnw

+1

@finnw मुझे नहीं लगता कि वे डुप्लिकेट हैं। यह सवाल इटरेटर का उपयोग करने के लिए पूछ रहा है, दूसरा प्रत्येक लूप के लिए उपयोग कर रहा है। दोनों प्रश्न समान दृष्टिकोण से हल किए जाते हैं, इसलिए उत्तर डुप्लिकेट सवाल नहीं हैं। – Robert

उत्तर

70

अपने स्वयं के चर का उपयोग करें और इसे लूप में बढ़ाएं।

+4

लेकिन 'it.nextIndex()' के बारे में @ mateusz-dymczyk सुझाव भी देखें। संग्रह जब एक सूची है उपयोगी। – noamtm

2

एक int का उपयोग करें और इसे अपने लूप के भीतर बढ़ाएं।

9

किस तरह का संग्रह? यदि यह सूची इंटरफ़ेस का कार्यान्वयन है तो आप केवल it.nextIndex() - 1 का उपयोग कर सकते हैं।

4

संग्रह के माध्यम से पुन: प्रयास करने के लिए ListIterator का उपयोग करें। यदि संग्रह पहले सूची में बदलने के लिए उपयोग Arrays.asList(Collection.toArray()) के साथ शुरू करने के लिए एक सूची नहीं है।

0

here देखें।

iterator.nextIndex() तत्व की अनुक्रमणिका प्रदान करेगा जो बाद में कॉल द्वारा next() पर वापस कर दिया जाएगा।

List<String> list = Arrays.asList("zero", "one", "two"); 

int i = 0; 
for (Iterator<String> it = list.iterator(); it.hasNext(); i++) { 
    String s = it.next(); 
    System.out.println(i + ": " + s); 
} 

आउटपुट (आपने ठीक समझा):

+0

इंटरफ़ेस इटरेटर अगली इंडेक्स() विधि नहीं है।इसके लिए आपको स्पष्ट रूप से ListIterator का उपयोग करने की आवश्यकता है, लेकिन ओपी ने विशेष रूप से इटरेटर के बारे में सवाल किया। –

21

यहाँ अपने खुद के चर का उपयोग कर और यह संक्षिप्त रखने यह करने के लिए एक रास्ता है

0: zero 
1: one 
2: two 

लाभ यह है कि आप को नहीं बढ़ाते है आपके लूप के भीतर सूचकांक (हालांकि आपको प्रति लूप के बाद केवल इटरेटर # को कॉल करने के लिए सावधान रहना होगा - बस इसे शीर्ष पर करें)।

+2

यदि आप खुद को इटरेटर बनाते हैं तो आप एक सूची इटरेटर का भी उपयोग कर सकते हैं और अलग-अलग int चर की आवश्यकता नहीं है। –

+1

यदि आप Arrays.asList के लिए 'स्थैतिक आयात' का उपयोग करते हैं तो आप केवल 'asList ("शून्य", "एक", "दो")' – karmakaze

+0

लिख सकते हैं जो कि पॉल के जवाब को पढ़ने से पहले मैंने इसे ठीक किया । मैं दृढ़ता से आपके रास्ते को हतोत्साहित करता हूं, क्योंकि मुझे इसका कोई फायदा नहीं दिखता है। क्या आपको लगता है कि एक फायदा है (एक निर्दिष्ट के अलावा)। आपने प्रत्येक लूप के लिए क्यों उपयोग नहीं किया? यदि आप अपने स्वयं के चर का उपयोग करते हैं तो इटरेटर को स्पष्ट रूप से परिभाषित करना जरूरी नहीं है। –

75

मेरे पास एक ही प्रश्न था और एक सूची इटरेटर का उपयोग करके पाया गया। इसके बाद के संस्करण परीक्षण के लिए समान:

List<String> list = Arrays.asList("zero", "one", "two"); 

ListIterator iter = list.listIterator(); 

while (iter.hasNext()) { 
    System.out.println("index: " + iter.nextIndex() + " value: " + iter.next()); 
} 

आप nextIndex कॉल करने से पहले आप वास्तव में अगले मिलता है सुनिश्चित करें()।

+1

'यह सुनिश्चित करने के लिए धन्यवाद कि आप अगली इंडेक्स को कॉल करें, इससे पहले कि आप वास्तव में अगले()' –

19

आप गिनती करने के लिए ListIterator उपयोग कर सकते हैं:

final List<String> list = Arrays.asList("zero", "one", "two", "three"); 

for (final ListIterator<String> it = list.listIterator(); it.hasNext();) { 
    final String s = it.next(); 
    System.out.println(it.previousIndex() + ": " + s); 
} 
0

सभी आप इसे iterator.nextIndex() का उपयोग करने के लिए वर्तमान सूचकांक वापस जाने के लिए है कि पुनरावर्तक पर है की जरूरत है। यह आपके स्वयं के काउंटर वैरिएबल (जो अभी भी काम करता है) का उपयोग करने से थोड़ा आसान हो सकता है।

public static void main(String[] args) {  
    String[] str1 = {"list item 1", "list item 2", "list item 3", "list item 4"}; 
    List<String> list1 = new ArrayList<String>(Arrays.asList(str1)); 

    ListIterator<String> it = list1.listIterator(); 

    int x = 0; 

    //The iterator.nextIndex() will return the index for you. 
    while(it.hasNext()){ 
     int i = it.nextIndex(); 
     System.out.println(it.next() + " is at index" + i); 
    } 
} 

इस कोड List1 सूची के माध्यम से एक समय में एक आइटम जाने के लिए और आइटम के पाठ प्रिंट होगा, फिर "सूचकांक में है" तो यह सूचकांक प्रिंट होगा कि इटरेटर पर यह पाया। :)

+1

वास्तव में प्राप्त करें, वास्तव में, आपका कोड एक से बंद है क्योंकि यह इसे कॉल करने के बाद इंडेक्स को प्रदर्शित करने का प्रयास करता है। – Henrik

+1

आप सही हैं, धन्यवाद! मेरे भाग पर बहुत देर से जवाब। – Ryan

-3

बस कुछ इस तरह करते हैं:

for (AbstractDevice device : mDevicesList){ 
int curIndex = mDevicesList.indexOf(device)); 

      } 
की
+4

कॉलिंग इंडेक्सऑफ() को डिवाइस सूची के अतिरिक्त स्कैन की आवश्यकता होगी। स्थानीय काउंटर को बढ़ाने के लिए यह तेज़ होगा। –

संबंधित मुद्दे