একটি List<Integer>
, বা সম্ভবত একটি Integer[]
বা int[]
কিছু থেকে ক্রমান্বিত মানগুলি start
একটি মান থেকে উত্পন্ন করার জন্য একটি ছোট এবং মিষ্টি উপায় আছে end
?
এটি হ'ল, এর চেয়ে ছোট কিছু কিন্তু নিম্নলিখিত 1 টির সমতুল্য :
void List<Integer> makeSequence(int begin, int end) {
List<Integer> ret = new ArrayList<>(end - begin + 1);
for (int i=begin; i<=end; i++) {
ret.add(i);
}
return ret;
}
পেয়ারার ব্যবহার ঠিক আছে।
হালনাগাদ:
কর্মক্ষমতা বিশ্লেষণ
যেহেতু এই প্রশ্নটি বেশ কয়েকটি ভাল উত্তর পেয়েছে, উভয়ই নেটিভ জাভা 8 এবং তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে, আমি ভেবেছিলাম যে আমি সমস্ত সমাধানগুলির কার্যকারিতা পরীক্ষা করব।
প্রথম পরীক্ষাটি [1..10]
নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে 10 টি উপাদানের একটি তালিকা তৈরি করার পরীক্ষা করে:
- ClassAArayLList : আমার প্রশ্নের উপরে বর্ণিত কোড (এবং মূলত আদর্শের উত্তর হিসাবে একই)।
- গ্রহনক্ষেত্র সংগ্রহ: নিচের দিকে ডোনাল্ডের উত্তরে গ্রীকস সংগ্রহ 8.0 ব্যবহার করে দেওয়া কোড ।
- পেয়ারাঞ্জেজ : নীচে দাভবের উত্তরে দেওয়া কোড । প্রযুক্তিগতভাবে, এটি একটি
List<Integer>
নয় বরং একটি তৈরি করেContiguousSet<Integer>
- তবে যেহেতু এটি ক্রমটি কার্যকরIterable<Integer>
করে, এটি বেশিরভাগ ক্ষেত্রে আমার উদ্দেশ্যে কাজ করে। - ইন্টস্ট্রিমরেঞ্জ : নীচে ভ্লাদিমিরের উত্তরে প্রদত্ত কোড , যা ব্যবহার করে
IntStream.rangeClosed()
- যা জাভা 8-এ চালু হয়েছিল। - স্ট্রিমিট্রেট : নীচে ক্যাটালিনের উত্তরে প্রদত্ত কোড যা
IntStream
জাভা 8-তে প্রবর্তিত কার্যকারিতাও ব্যবহার করে।
উপরের সমস্তটির জন্য এখানে প্রতি সেকেন্ডে কিলো-অপারেশনের ফলাফল রয়েছে (উচ্চতর সংখ্যা আরও ভাল), মাপের 10 টির তালিকা সহ:
... এবং আবার 10,000 টি আকারের তালিকার জন্য:
শেষের চার্টটি সঠিক - এক্লিপস এবং পেয়ারা ব্যতীত অন্যান্য সমাধানগুলি এমনকি একটি পিক্সেল বার পেতে খুব ধীর হয়! দ্রুত সমাধানগুলি বাকীগুলির চেয়ে 10,000 থেকে 20,000 গুণ বেশি দ্রুত।
এখানে যা চলছে তা অবশ্যই, পেয়ারা এবং গ্রহনের সমাধানগুলি আসলে 10,000 ধরণের উপাদান তালিকা তৈরি করে না - এগুলি কেবল শুরু এবং শেষের পয়েন্টগুলির চারপাশে স্থির আকারের মোড়কযুক্ত। প্রতিটি উপাদান পুনরাবৃত্তির সময় প্রয়োজন হিসাবে তৈরি করা হয়। যেহেতু আমরা আসলে এই পরীক্ষায় পুনরাবৃত্তি করি না, তাই ব্যয় পিছনে দেওয়া হয়। অন্যান্য সমস্ত সমাধানের প্রকৃতপক্ষে মেমরির পুরো তালিকাটি তৈরি করে এবং কেবলমাত্র একটি সৃষ্টি-ভিত্তিক মানদণ্ডে একটি ভারী মূল্য প্রদান করে।
আসুন আমরা আরও কিছু বাস্তবসম্মত কিছু করি এবং সমস্ত সংখ্যার সংগে সংক্ষেপে পুনরাবৃত্তি করি। সুতরাং IntStream.rangeClosed
বৈকল্পিকের ক্ষেত্রে , মাপদণ্ডটি এমন দেখাচ্ছে:
@Benchmark
public int intStreamRange() {
List<Integer> ret = IntStream.rangeClosed(begin, end).boxed().collect(Collectors.toList());
int total = 0;
for (int i : ret) {
total += i;
}
return total;
}
এখানে, চিত্রগুলি অনেক পরিবর্তন করে, যদিও অ অ-বস্তুগত সমাধানগুলি এখনও সবচেয়ে দ্রুত। এখানে দৈর্ঘ্য = 10:
... এবং দৈর্ঘ্য = 10,000:
অনেক উপাদানগুলির উপর দীর্ঘ পুনরাবৃত্তি অনেকগুলি জিনিসকে সন্নিবিষ্ট করে, তবে 10,000 উপাদান পরীক্ষায়ও গ্রহ এবং পেয়ারা দ্বিগুণের বেশি দ্রুত থেকে যায়।
সুতরাং আপনি যদি সত্যই চান তবে List<Integer>
গ্রহগ্রহের সংগ্রহগুলি সেরা পছন্দ হিসাবে মনে হয় - তবে অবশ্যই যদি আপনি আরও স্থানীয় উপায়ে স্ট্রিম ব্যবহার করেন (যেমন, .boxed()
আদিম ডোমেনে ভুলে যাওয়া এবং হ্রাস করা) আপনি সম্ভবত এই সমস্তগুলির চেয়ে দ্রুত শেষ করবেন রূপগুলো।
1 সম্ভবত ত্রুটি পরিচালনার ব্যতীত উদাহরণস্বরূপ, যদি end
< begin
, বা আকারটি কিছু বাস্তবায়ন বা জেভিএম সীমা অতিক্রম করে (যেমন, এর চেয়ে বড় অ্যারেগুলি) 2^31-1
।