ইলেটর ব্যবহার করার সময় কীভাবে বর্তমান লুপ সূচক পাবেন?


107

আমি একটি সংগ্রহের মাধ্যমে পুনরাবৃত্তি করতে একটি আইট্রেটর ব্যবহার করছি এবং আমি বর্তমান উপাদানটির সূচক পেতে চাই।

আমি এটা কিভাবে করবো?



1
@ তবে আমি সেগুলি সদৃশ বলে মনে করি না। এই প্রশ্নটি আইট্রেটার ব্যবহার করে জিজ্ঞাসা করছে, অন্যটি প্রতিটি লুপের জন্য ব্যবহার করছে। উভয় প্রশ্ন একই ধরণের পদ্ধতির দ্বারা সমাধান করা হয়, সুতরাং উত্তরগুলি সদৃশ নয় প্রশ্নটি।
রবার্ট

উত্তর:


92

আপনার নিজের ভেরিয়েবল ব্যবহার করুন এবং লুপে এটি বৃদ্ধি করুন।


6
তবে @ মাতিউস-ডাইমজিক পরামর্শ সম্পর্কেও দেখুন it.nextIndex()। যখন সংগ্রহটি একটি তালিকা হয় তখন দরকারী।
noamtm

113

আমারও একই প্রশ্ন ছিল এবং একটি লিস্টিস্ট্রেটার ব্যবহার করে কাজ করে। উপরের পরীক্ষার মতো:

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
'প্রকৃতপক্ষে পরবর্তীটি () পাওয়ার আগে আপনি পরবর্তী সূচকে কল করেছেন তা নিশ্চিত করার জন্য ধন্যবাদ
গঙ্গাধর জ্যানু

ধন্যবাদ, আমি এই সম্পর্কে আগে জানতাম না। আমি সতর্কতাটি করব যে লিস্টিএটরেটর দ্বিদ্বিদ্বন্দ্বী তবে আইট্রেটার একমুখী। যতক্ষণ আপনি কার্যকরভাবে একটি কার্সার যা নিয়ে পিছনে পিছনে অগ্রসর হওয়া এড়াতে হবে, ততক্ষণ আপনি নিরাপদ থাকা উচিত।
ব্যবহারকারী 2910265

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
আপনি যদি অ্যারে.এএসলিস্টের জন্য 'স্থিতিশীল আমদানি' ব্যবহার করেন তবে আপনি কেবল লিখতে পারেনasList("zero", "one", "two")
কর্মকাজে

আমি পলের উত্তর পড়ার আগে ঠিক সেভাবেই এটি করেছি। আমি দৃ way়ভাবে আপনার পথ নিরুৎসাহিত করব, কারণ আমি এর কোনও সুবিধা দেখছি না। আপনি কি মনে করেন এর কোনও সুবিধা আছে (উল্লিখিত ব্যতীত)। কেন আপনি প্রতিটি লুপ ব্যবহার করেন নি? স্পষ্টভাবে Iterator সংজ্ঞা দেওয়া প্রয়োজন হয় না, যদি আপনি নিজের ভেরিয়েবল ব্যবহার করেন।
উইল মেন্টজেল

@ প্রগ্রেসিভ_ভারলোড কেবলমাত্র আপনার যদি কোনও আইট্রেটার প্রয়োজন (প্রশ্ন হিসাবে যেমন লাইব্রেরিতে পাস করার জন্য), যা উদাহরণটি দেখায় না। এই উদাহরণে আপনার লুপের বাইরে চলক রয়েছে এবং একবার # নেক্সট কল করতে সাবধান হওয়া দরকার। পলের উদাহরণে লুপের বাইরে কোনও ভেরিয়েবল নেই, তবে আপনাকে একবার "নেক্সট এবং # এনেক্সট ইনডেক্স" একবারে কল করতে সতর্কতা অবলম্বন করা উচিত (এবং বাস্তবে যদি একাধিকবার ব্যবহার করা হয় তবে সেগুলি স্থানীয় ভেরিয়েবলগুলিতে টানতে হবে, যা এই উদাহরণটি ব্যবহার করে না ' টি শো)।
টম ক্লিফট

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

12

কিসের সংগ্রহ? যদি এটি তালিকা ইন্টারফেসের বাস্তবায়ন হয় তবে আপনি কেবল ব্যবহার করতে পারেন it.nextIndex() - 1


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
ইন্ডেক্সঅফ () কে কল করার জন্য ডিভাইস তালিকার অতিরিক্ত স্ক্যানের প্রয়োজন হবে। এটি কেবল একটি স্থানীয় কাউন্টারকে বাড়ানো দ্রুত হবে।
গ্রেগ ব্রাউন

1
সম্মত হয়। এটি সবচেয়ে কার্যকর সমাধান নয়।
সানি

1
দেখে মনে হচ্ছে আপনি আরও দক্ষ হওয়ার জন্য উদাহরণটি আপডেট করেছেন।
গ্রেগ ব্রাউন 13


1

এখানে দেখুন ।

iterator.nextIndex()উপাদানগুলির সূচক সরবরাহ করবে যা পরবর্তী কল করে ফিরে আসবে next()


ইন্টারফেস Iterator এর NextIndex () পদ্ধতি নেই। এজন্য আপনাকে সুস্পষ্টভাবে একটি তালিকার তালিকা ব্যবহার করতে হবে, তবে ওপেন আইট্রেটার সম্পর্কে বিশেষভাবে প্রশ্ন করেছিলেন।
ফ্রান মারজোয়া

0

আপনার পুনরুক্তিটি চালু থাকা বর্তমান সূচকটি ফিরিয়ে দিতে আপনার কেবল এটির ব্যবহারকারীর পুনরায় ব্যবহার করতে হবে ne এনেক্সট ইন্ডেক্স ()। এটি আপনার নিজের কাউন্টার ভেরিয়েবল ব্যবহার করার চেয়ে কিছুটা সহজ হতে পারে (এটি এখনও কার্যকর হয়)।

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
প্রকৃতপক্ষে, আপনার কোডটি একের পর এক বন্ধ রয়েছে কারণ এটি কল করে পরে সূচি প্রদর্শন করার চেষ্টা করে ne
হেনরিক এ্যাসটেড সেরেনসেন

0

আপনার কাছে ইতিমধ্যে উত্তরটি থাকলেও কিছু তথ্য যুক্ত করার চিন্তা করে।

আপনি যেমন সংগ্রহগুলি স্পষ্টভাবে উল্লেখ করেছেন, আপনি listIteratorসমস্ত ধরণের সংগ্রহের সূচক পেতে ব্যবহার করতে পারবেন না ।

ইন্টারফেস তালিকা - অ্যারেলিস্ট, লিংকডলিস্ট, ভেক্টর এবং স্ট্যাক।

উভয় iterator()এবং আছেlistIterator()

ইন্টারফেস সেট করুন - হ্যাশসেট, লিংকডহ্যাশসেট, ট্রিসেট এবং এনামসেট।

শুধুমাত্র আছে iterator()

মানচিত্র ইন্টারফেস - হ্যাশম্যাপ, লিংকডহ্যাশম্যাপ, ট্রিম্যাপ এবং আইডেন্টিটি হ্যাশম্যাপ

কোনও পুনরুক্তি নেই, তবে 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;

}

সাথে জিসিসি -9 তে পরীক্ষা করা হয়েছে -std=c++11পতাকা

আউটপুট:

0
1
2
3
4

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.