কৌশল এখানে "বিপরীত" সংজ্ঞায়িত করছে। যে কেউ তালিকায় স্থান পরিবর্তন করতে পারে, বিপরীতে ক্রমে একটি অনুলিপি তৈরি করতে পারে বা বিপরীত ক্রমে একটি ভিউ তৈরি করতে পারে।
স্বজ্ঞাতভাবে বলতে গেলে সবচেয়ে সহজ উপায় হ'ল Collections.reverse
:
Collections.reverse(myList);
এই পদ্ধতিটি তালিকায় স্থান পরিবর্তন করে । অর্থাৎ, Collections.reverse
তালিকাটি গ্রহণ করে এবং এর উপাদানগুলিকে ওভাররাইট করে, কোনও বিপরীত অনুলিপিটি পিছনে ছাড়েনি। এটি কিছু ব্যবহারের ক্ষেত্রে উপযুক্ত তবে অন্যদের জন্য নয়; তদতিরিক্ত, এটি ধরে রাখে যে তালিকাটি পরিবর্তনযোগ্য। যদি এটি গ্রহণযোগ্য হয় তবে আমরা ভাল।
যদি তা না হয় তবে বিপরীত ক্রমে একটি অনুলিপি তৈরি করতে পারে :
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
এই পদ্ধতির কাজ করে তবে তালিকার দ্বিগুণ পুনরুক্তি প্রয়োজন। অনুলিপি নির্মাণকারী ( new ArrayList<>(list)
) তালিকাটির উপরে পুনরাবৃত্তি করে এবং তাই করে Collections.reverse
। আমরা কেবল এই পদ্ধতিটি পুনরাবৃত্তি করতে কেবল একবারে পুনরায় লিখতে পারি, যদি আমরা এত ঝুঁকিতে থাকি:
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
এটি আরও দক্ষ, তবে আরও ভারবস।
বিকল্পভাবে, আমরা জাভা 8 এর stream
এপিআই ব্যবহার করতে উপরের পুনর্লিখন করতে পারি , যা কিছু লোক উপরের চেয়ে আরও সংক্ষিপ্ত এবং সুস্পষ্ট বলে মনে করে:
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
বিশেষ দ্রষ্টব্য। যে Collectors.toList()
ফলাফলের তালিকা সম্পর্কে খুব কম গ্যারান্টী করে তোলে। আপনি যদি ফলাফলটি অ্যারেলিস্ট হিসাবে ফিরে আসে তা নিশ্চিত করতে চান তবে Collectors.toCollection(ArrayList::new)
পরিবর্তে ব্যবহার করুন।
তৃতীয় বিকল্পটি বিপরীত ক্রমে একটি ভিউ তৈরি করা । এটি একটি আরও জটিল সমাধান, এবং আরও পড়ার / তার নিজের প্রশ্নে যোগ্য। পেয়ারার তালিকাগুলি # বিপরীত পদ্ধতিটি একটি কার্যকর পর্ব।
একটি "সাধারণ" বাস্তবায়ন নির্বাচন করা পাঠকের অনুশীলন হিসাবে ছেড়ে গেছে।