Iterator का उपयोग करते समय वर्तमान लूप इंडेक्स कैसे प्राप्त करें?


107

मैं एक संग्रह के माध्यम से पुनरावृति करने के लिए एक Iterator का उपयोग कर रहा हूं और मैं वर्तमान तत्व का सूचकांक प्राप्त करना चाहता हूं।

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



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

जवाबों:


92

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


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

113

मेरे पास एक ही सवाल था और एक ListIterator ने काम किया। उपरोक्त परीक्षण के समान:

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

ListIterator iter = list.listIterator();

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

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


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

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

28

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

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: zero
1: one
2: two

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


3
यदि आप स्वयं इट्रेटर बनाते हैं, तो आप सूची सूची का भी उपयोग कर सकते हैं और अलग-अलग इंट चर की आवश्यकता नहीं है।
रॉबर्ट क्लेमे

1
यदि आप Arrays.asList के लिए एक 'स्थैतिक आयात' का उपयोग करते हैं तो आप बस लिख सकते हैंasList("zero", "one", "two")
कर्मकाज

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

@progressive_overload सिर्फ अगर आपको एक Iterator (प्रश्न के अनुसार, उदाहरण के लिए पुस्तकालय पास करने की आवश्यकता है), जो उदाहरण नहीं दिखाता है। इस उदाहरण में आप लूप के बाहर एक चर है और एक बार #next को कॉल करने के लिए सावधान रहने की जरूरत है। पॉल के उदाहरण में, लूप के बाहर कोई चर नहीं हैं, लेकिन आपको एक बार #next और #nextIndex को एक साथ कॉल करने के लिए सावधान रहने की आवश्यकता है (और अगर व्यवहार में, एक से अधिक बार उपयोग किया जाता है, तो उन्हें स्थानीय चर में खींच लिया जाएगा, जो कि ' टी शो)।
टॉम क्लिफ्ट

23

आप 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);
}


4

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


3

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

        ListIterator<String> it = list1.listIterator();
        int index = -1;
        while (it.hasNext()) {
            index++;
            String value = it.next();
            //At this point the index can be checked for the current element.

        }

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

1
माना। यह सबसे कारगर उपाय नहीं है।
सनी

1
लगता है कि आपने उदाहरण को अधिक कुशल होने के लिए अद्यतन किया है।
ग्रेग ब्राउन


1

देखें यहाँ

iterator.nextIndex()तत्व का सूचकांक प्रदान करेगा जिसे बाद में कॉल करके वापस किया जाएगा next()


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

0

आप सभी को इसे itter.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); 
    }
}

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


1
दरअसल, आपका कोड एक-एक करके बंद हो जाता है क्योंकि यह सूचकांक के बाद इसे प्रदर्शित करने का प्रयास करता है। स्नेक्स ()।
हेनरिक ऐस सोरेनसेन

0

हालांकि आपके पास पहले से ही उत्तर था, कुछ जानकारी जोड़ने के लिए सोचा।

जैसा कि आपने स्पष्ट रूप से संग्रह का उल्लेख किया है, आप listIteratorसभी प्रकार के संग्रह के लिए सूचकांक प्राप्त करने के लिए उपयोग नहीं कर सकते ।

सूची इंटरफेस - एरियरिस्ट, लिंक्डलिस्ट, वेक्टर और स्टैक।

दोनों है iterator()औरlistIterator()

सेट इंटरफेस - हैशसेट, लिंक्डहाशसेट, ट्रीसेट और एनुसेट।

केवल है iterator()

मैप इंटरफेस - हैशपैप, लिंक्डहाशपैप, ट्रीपैप और आइडेंटिटी हाशप

कोई iterators है, लेकिन के माध्यम से उपयोग करते हुए दोहराया जा सकता है keySet()/ values()या entrySet()के रूप में keySet()और entrySet()रिटर्न Setऔर values()रिटर्न Collection

तो iterators()किसी भी संग्रह प्रकार के लिए वर्तमान सूचकांक प्राप्त करने के लिए मूल्य में निरंतर वृद्धि के साथ इसका उपयोग करना बेहतर है ।


-1

यह सबसे सरल उपाय होगा!

std::vector<double> v (5);

for(auto itr = v.begin();itr != v.end();++itr){

 auto current_loop_index = itr - v.begin();

  std::cout << current_loop_index << std::endl;

}

-std=c++11ध्वज के साथ gcc-9 पर परीक्षण किया गया

आउटपुट:

0
1
2
3
4

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