জাভা ভাষায় কিছুটা নতুন হওয়ার কারণে আমি নিজেকে সেই সমস্ত উপায়ের সাথে (বা কমপক্ষে অ-প্যাথলজিকাল বিষয়গুলি) সাথে পরিচিত করার চেষ্টা করছি যা কোনও তালিকার (বা সম্ভবত অন্যান্য সংগ্রহগুলি) এবং প্রতিটিটির সুবিধা বা অসুবিধাগুলির মাধ্যমে পুনরাবৃত্তি করতে পারে।
একটি List<E> listঅবজেক্ট দেওয়া , আমি সমস্ত উপাদান লুপ করার নিম্নলিখিত উপায়গুলি সম্পর্কে জানি:
লুপের জন্য বেসিক (অবশ্যই সমান / লুপগুলিও রয়েছে)whiledo while
// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
দ্রষ্টব্য: @ মার্সিল্লান যেমন উল্লেখ করেছেন, এই ফর্মটি ওভারের জন্য পুনরাবৃত্তি করার জন্য একটি দুর্বল পছন্দ List, কারণ getপদ্ধতির আসল বাস্তবায়ন কোনও ব্যবহার করার সময় যেমন দক্ষ নাও হতে পারে Iterator। উদাহরণস্বরূপ, LinkedListবাস্তবায়নগুলি অবশ্যই i-th উপাদানটি পেতে i এর আগের সমস্ত উপাদানকে অতিক্রম করবে।
উপরের উদাহরণে Listভবিষ্যতের পুনরাবৃত্তিকে আরও দক্ষ করে তোলার জন্য "এর জায়গাটি সংরক্ষণ করুন" বাস্তবায়নের কোনও উপায় নেই । একটি জন্য ArrayListএটা সত্যিই ব্যাপার, কারণ জটিলতা / মূল্য না getধ্রুবক সময় (হে (1)) জন্য, অন্যদিকে একজন LinkedListএটা তালিকার আকার সমানুপাতিক (হে (ঢ))।
অন্তর্নির্মিত Collectionsবাস্তবায়নগুলির গণ্য জটিলতা সম্পর্কে আরও তথ্যের জন্য , এই প্রশ্নটি দেখুন ।
লুপের জন্য বর্ধিত ( এই প্রশ্নে সুন্দরভাবে ব্যাখ্যা করা হয়েছে )
for (E element : list) {
// 1 - can call methods of element
// ...
}
iterator
for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// ...
}
ListIterator
for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// 3 - can use iter.add(...) to insert a new element into the list
// between element and iter->next()
// 4 - can use iter.set(...) to replace the current element
// ...
}
কার্যকরী জাভা
list.stream().map(e -> e + 1); // Can apply a transformation function for e
Iterable.forEach , Stream.forEach , ...
(জাভা 8 এর স্ট্রিম এপিআইয়ের একটি মানচিত্রের পদ্ধতি (@ i_am_zero এর উত্তর দেখুন)))
জাভাতে 8 সংগ্রহের ক্লাসগুলি প্রয়োগ করে Iterable(উদাহরণস্বরূপ, সমস্ত Listগুলি) এখন একটি forEachপদ্ধতি রয়েছে, যা উপরে প্রদর্শিত লুপ স্টেটমেন্টের পরিবর্তে ব্যবহার করা যেতে পারে । (এখানে আরও একটি প্রশ্ন যা একটি ভাল তুলনা প্রদান করে))
Arrays.asList(1,2,3,4).forEach(System.out::println);
// 1 - can call methods of an element
// 2 - would need reference to containing object to remove an item
// (TODO: someone please confirm / deny this)
// 3 - functionally separates iteration from the action
// being performed with each item.
Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
// Same capabilities as above plus potentially greater
// utilization of parallelism
// (caution: consequently, order of execution is not guaranteed,
// see [Stream.forEachOrdered][stream-foreach-ordered] for more
// information about this).
অন্য কোন উপায় আছে, যদি থাকে?
(বিটিডাব্লু, আমার আগ্রহটি পারফরম্যান্সকে অনুকূল করে তোলার আকাঙ্ক্ষায় একেবারেই কাটেনি ; আমি কেবল এটি জানতে চাই যে বিকাশকারী হিসাবে আমার কাছে কী ফর্মগুলি উপলভ্য।
Listইন্টারফেস সম্পর্কে প্রশ্ন বিশেষভাবে হয়?