জাভাতে একটি তালিকা উল্টানো - ইন-প্লেস এবং অফ-প্লেস

এই সংক্ষিপ্ত টিউটোরিয়ালে, আপনি শিখবেন কিভাবে জাভাতে স্থানের মধ্যে এবং স্থানের বাইরে একটি তালিকা উল্টাতে হয়।

ইন-প্লেস এবং আউট-অফ-প্লেস বিপরীত করা

তালিকায় ক্রিয়াকলাপগুলি সম্পাদন করার সময় - আপনি হয়তো বিবেচনা করতে চাইতে পারেন যে অপারেশনগুলি জায়গায় করা হয়েছে (পরিবর্তনগুলি আসল বস্তুতে কার্যকর করা হয়েছে), বা সেগুলি স্থানের বাইরে রয়েছে কিনা (পরিবর্তনগুলি একটি অনুলিপিতে কার্যকর করা হয়েছে, এবং মূল বস্তু অপরিবর্তিত)।

কিছু ভাষা এবং লাইব্রেরি বিভিন্ন ডিফল্ট আচরণ পছন্দ করে। জাভাতে, উল্টানো তালিকার বেশিরভাগ অপারেশন হবে জায়গায়.

এই যদি আপনার পছন্দসই আচরণ - মহান! যদি না হয়, আপনি অনুলিপিটি উল্টানোর আগে তালিকার একটি অনুলিপি তৈরি করতে চাইবেন:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

বিঃদ্রঃ: সার্জারির clone() পদ্ধতি না একটি গভীর অনুলিপি তৈরি করুন। ব্যবহার করে একটি তালিকা তৈরি করা হচ্ছে new ArrayList(list) না একটি গভীর অনুলিপি তৈরি করুন। গভীর অনুলিপি তৈরি করা নিরুৎসাহিত করা হয়, এবং সাধারণ উপায়ে করা আশ্চর্যজনকভাবে কঠিন (এবং তালিকার ডেটা প্রকার(গুলি) এর উপর নির্ভর করে কিছু ক্ষেত্রে এর অর্থ হয় না)। এটি আপনাকে বিপরীত করতে সক্ষম হতে বাধা দেবে না list এবং না এর উপাদান আছে listCopy বিপরীত হচ্ছে, যদিও.

Collections.reverse()

সার্জারির Collections.reverse() পদ্ধতি হল একটি সংগ্রহকে বিপরীত করার জন্য আদর্শ পদ্ধতি এবং "অনুপস্থিত" হিসাবে কাজ করে List.reverse() পদ্ধতি এটি জায়গায় তালিকাটি বিপরীত করে:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

Collections.reverse(list);

System.out.println(list);     
System.out.println(listCopy); 

পেয়ারার তালিকা. বিপরীত (তালিকা)

আপনি যদি আপনার প্রোজেক্টে ইতিমধ্যেই Google Guava ব্যবহার করছেন, তাহলে আপনি এর সুবিধাও নিতে পারেন Lists ক্লাস, যা অফার করে reverse() পদ্ধতি, যা জায়গায় মূল তালিকা সাজায় না, কিন্তু একটি অনুলিপি তৈরি করে এবং অনুলিপিটিকে বিপরীত করে:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List reversedList = Lists.reverse(list);

System.out.println(list);         
System.out.println(reversedList); 

যদি আপনার কাছে এটি ইতিমধ্যে না থাকে, তাহলে আপনি Maven ব্যবহার করে আপনার প্রোজেক্টে Google Guava যোগ করতে পারেন, এর নির্ভরতা অন্তর্ভুক্ত করে আপনার pom.xml ফাইল:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
</dependency>

অথবা Gradle এর মাধ্যমে:

implementation group: 'com.google.guava', name: 'guava'

বিঃদ্রঃ: যদি আপনার কাছে ইতিমধ্যেই Google Guava না থাকে, বা আপনার প্রকল্পের অন্যান্য অংশের জন্য এটি ব্যবহার করার ইচ্ছা না থাকে - শুধুমাত্র এই ক্রিয়াকলাপের জন্য এটি আমদানি করবেন না এবং এটিতে লেগে থাকুন Collections.reverse() পদ্ধতি পেয়ারা একটি বড় নির্ভরতা, এবং এটি একটি বড় ওভারকিল এটি শুধুমাত্র এই অপারেশনের জন্য ব্যবহার করুন।

List.add() এবং List.remove()

আপনি যদি তালিকাটি উল্টানো ছাড়াও অতিরিক্ত ক্রিয়াকলাপ সম্পাদন করতে চান - আপনি মূল তালিকার মাধ্যমে পুনরাবৃত্তি করতে পারেন, উপাদানগুলিকে শেষ থেকে সরাতে পারেন, তাদের একটি নির্বিচারে পদ্ধতির মাধ্যমে পাস করতে পারেন এবং তালিকার শুরুতে সেগুলি আবার যুক্ত করতে পারেন:


public static int process(int input) {
    return input;
}

List list = new ArrayList(Arrays.asList(1, 2, 3));

for (int i = 0, j = list.size()-1; i <= j; i++) {
    int lastValue = process(list.remove(j));
    list.add(i, lastValue);
}

System.out.println(list);  

উচ্চতার চিহ্ন

সুতরাং, কোনটি দ্রুততম? এটাও নির্ভর করে আপনি কি জায়গায় অপারেশন করতে চান নাকি বাইরে।

ইন-প্লেস রিভার্সাল বেঞ্চমার্ক

চলুন, স্থানের বাইরে থেকে শুরু করে তিনটি পদ্ধতিতেই উভয় পন্থাকে বেঞ্চমার্ক করি:

List list = new Random().ints(100, 1, 11)
                .boxed()
                .collect(Collectors.toList());

int runs = 1000;

long start1 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListCollections(list);
}
long end1 = System.currentTimeMillis();
System.out.println(String.format("Collections.reverse() took: %s miliseconds", end1-start1));

long start2 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListGuava(list);
}
long end2 = System.currentTimeMillis();
System.out.println(String.format("Guava's Lists.reverse() took: %s miliseconds", end2-start2));

long start3 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListManually(list);
}
long end3 = System.currentTimeMillis();
System.out.println(String.format("Manually took: %s miliseconds", end3-start3));

System.out.println("Original list: " + list);

এর ফলে:

Collections.reverse() took: 3 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 13 miliseconds
Original list: [6, 7, 9, 7, 2, 5, 4, 1, 3, 2, 2, 6, ...

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

আমরা যখন উপাদানের সংখ্যা 100 থেকে 1000 পর্যন্ত বাড়াই তখন কী হবে?

Collections.reverse() took: 9 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 133 miliseconds
Original list: [10, 2, 2, 6, 2, 4, 7, 3, 9, 2, 7, 5, ...

পেয়ারা ৪ এমএস চিহ্ন ধরে রেখেছে! ম্যানুয়াল পদ্ধতির সবচেয়ে খারাপ সময় জটিলতা রয়েছে এবং এটি রৈখিকভাবে বেড়েছে। Collections.reverse() স্কেলিং আপে কম ভোগে, কিন্তু পেয়ারার বাস্তবায়ন সবচেয়ে কম ক্ষতিগ্রস্থ হয়। যদিও, মনে রাখবেন যে আমরা পেয়ারা পদ্ধতির জন্য ম্যানুয়ালি তালিকাটি অনুলিপি করি না। আমরা একটি "মূল" এবং "বিপরীত" তালিকা থাকার ধারণা খাঁচা যখন বেঞ্চমার্ক পরিবর্তন হবে?

আউট-অফ-প্লেস রিভার্সাল বেঞ্চমার্ক

1000টি উপাদান সহ, এবং প্রতিটি তালিকার একটি অ-বিপরীত অনুলিপিতে কাজ করে (যা সময় পরিমাপ থেকে বাদ দেওয়া হয়েছিল), যখন আমরা প্রতিটি পদ্ধতি থেকে ম্যানুয়াল কপিটি সরিয়ে ফেলি এবং কোডটি পুনরায় চালাই:

Collections.reverse() took: 7 miliseconds
Guava's Lists.reverse() took: 3 miliseconds
Manually took: 131 miliseconds
Original list: [6, 8, 10, 7, 3, 8, 7, 1, 1, 9, 5, ...

পেয়ারা এখনো ধারাবাহিকভাবে উভয়কে ছাড়িয়ে যেতে পরিচালনা করে Collections.reverse() এবং ম্যানুয়াল পদ্ধতি।

উপসংহার

এই সংক্ষিপ্ত নির্দেশিকাটিতে, আপনি শিখেছেন কিভাবে জাভাতে একটি তালিকা উল্টাতে হয়, স্থানের মধ্যে এবং স্থানের বাইরে, অপারেশন থেকে আসল তালিকাটি সংরক্ষণ করে। আমরা ব্যবহার করেছি Collections.reverse() পদ্ধতি, গুগল পেয়ারার Lists.reverse() পদ্ধতি এবং একটি ম্যানুয়াল পদ্ধতি।

সময় স্ট্যাম্প:

থেকে আরো Stackabuse