জাভা ভাষায় কিছুটা নতুন হওয়ার কারণে আমি নিজেকে সেই সমস্ত উপায়ের সাথে (বা কমপক্ষে অ-প্যাথলজিকাল বিষয়গুলি) সাথে পরিচিত করার চেষ্টা করছি যা কোনও তালিকার (বা সম্ভবত অন্যান্য সংগ্রহগুলি) এবং প্রতিটিটির সুবিধা বা অসুবিধাগুলির মাধ্যমে পুনরাবৃত্তি করতে পারে।
একটি List<E> list
অবজেক্ট দেওয়া , আমি সমস্ত উপাদান লুপ করার নিম্নলিখিত উপায়গুলি সম্পর্কে জানি:
লুপের জন্য বেসিক (অবশ্যই সমান / লুপগুলিও রয়েছে)while
do 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
ইন্টারফেস সম্পর্কে প্রশ্ন বিশেষভাবে হয়?