তালিকা পুনরাবৃত্তিকারীরা প্রথম এবং সর্বাগ্রে গ্যারান্টি দেয় যে আপনি তালিকার অভ্যন্তরীণ ক্রমে তালিকার উপাদানগুলি (যেমন। সন্নিবেশকরণ ক্রম ) পান। আপনি সুনির্দিষ্টভাবে উপাদানগুলি inোকিয়েছেন বা আপনি কীভাবে তালিকাগুলি চালিয়েছেন তা আরও নির্দিষ্টভাবে এটি। বাছাই করা ডেটা স্ট্রাকচারের হেরফের হিসাবে দেখা যায় এবং তালিকাটি বাছাই করার বিভিন্ন উপায় রয়েছে।
আমি ব্যক্তিগতভাবে এটি যেমন দেখছি ততই আমি কার্যকরতার ক্রমে উপায়গুলি অর্ডার করব :
1. ব্যবহার বিবেচনা করুন Set
Bag
পরিবর্তে বা সংগ্রহ
দ্রষ্টব্য: আমি এই বিকল্পটি শীর্ষে রেখেছি কারণ এটি আপনি সাধারণত যেভাবেই করতে চান।
একটি সাজানো সেট স্বয়ংক্রিয়ভাবে সন্নিবেশের সময় সংগ্রহটি বাছাই করে, এর অর্থ এটি আপনি বাছাইয়ের সময় উপাদানগুলি যুক্ত করার সময় এটি বাছাই করে। এর অর্থ হ'ল আপনাকে ম্যানুয়ালি বাছাই করার দরকার নেই।
তদ্ব্যতীত যদি আপনি নিশ্চিত হন যে নকল উপাদানগুলি সম্পর্কে আপনার (বা) থাকা উচিত না তবে আপনি TreeSet<T>
পরিবর্তে এটি ব্যবহার করতে পারেন । এটি প্রয়োগ করে SortedSet
এবং NavigableSet
ইন্টারফেসগুলি কার্যকর করে যেমন আপনি সম্ভবত কোনও তালিকা থেকে প্রত্যাশা করেছেন:
TreeSet<String> set = new TreeSet<String>();
set.add("lol");
set.add("cat");
// automatically sorts natural order when adding
for (String s : set) {
System.out.println(s);
}
// Prints out "cat" and "lol"
যদি আপনি প্রাকৃতিক ক্রমটি না চান তবে আপনি কনস্ট্রাক্টর প্যারামিটার ব্যবহার করতে পারেন যা একটি takes Comparator<T>
।
বিকল্পভাবে, আপনি মাল্টিটসেটস ( ব্যাগ নামেও পরিচিত ) ব্যবহার করতে পারেন , এটি এমন একটি Set
যা সদৃশ উপাদানগুলিকে মঞ্জুরি দেয় এবং এর পরিবর্তে তৃতীয় পক্ষের প্রয়োগ রয়েছে। সবচেয়ে উল্লেখযোগ্যভাবে পেয়ারা লাইব্রেরি থেকে একটিTreeMultiset
, এটি অনেকটা কাজ করে TreeSet
।
2. সাথে আপনার তালিকা বাছাই Collections.sort()
উপরে উল্লিখিত হিসাবে, বাছাই List
s এর তথ্য কাঠামোর ম্যানিপুলেশন। সুতরাং এমন পরিস্থিতিতে যেখানে আপনার "সত্যের একটি উত্স" দরকার যা বিভিন্ন উপায়ে সাজানো হবে তারপরে ম্যানুয়ালি বাছাই করা হ'ল উপায়।
আপনি java.util.Collections.sort()
পদ্ধতিটি দিয়ে আপনার তালিকাটি বাছাই করতে পারেন । কীভাবে একটি কোড নমুনা এখানে:
List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");
Collections.sort(strings);
for (String s : strings) {
System.out.println(s);
}
// Prints out "cat" and "lol"
তুলনামূলক ব্যবহার
এক স্পষ্ট সুবিধা যা আপনি ব্যবহার করতে পারে Comparator
মধ্যে sort
পদ্ধতি। জাভা কিছু বাস্তবায়ন Comparator
যেমন যেমন Collator
লোকাল সংবেদনশীল বাছাইয়ের স্ট্রিংয়ের জন্য কার্যকর provides এখানে একটি উদাহরণ:
Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY); // ignores casing
Collections.sort(strings, usCollator);
সমবর্তী পরিবেশে বাছাই করা
যদিও লক্ষ্য রাখবেন যে sort
পদ্ধতিটি ব্যবহারটি সমবর্তী পরিবেশে বন্ধুত্বপূর্ণ নয়, যেহেতু সংগ্রহের উদাহরণটি ম্যানিপুলেটেড হবে এবং পরিবর্তে আপনার অপরিবর্তনীয় সংগ্রহগুলি বিবেচনা করা উচিত। এটি পেয়ারা Ordering
ক্লাসে সরবরাহ করে এবং এটি একটি সাধারণ ওলাইনার:
List<string> sorted = Ordering.natural().sortedCopy(strings);
3. সাথে আপনার তালিকা মোড়ানো java.util.PriorityQueue
জাভাতে কোন সাজানো তালিকা না থাকলেও সেখানে বাছাই করা সারি রয়েছে যা সম্ভবত আপনার জন্য ঠিক কাজ করবে। এটা java.util.PriorityQueue
ক্লাস।
নিকো হায়েস একটি সম্পর্কিত প্রশ্নের সাথে মন্তব্যে লিঙ্ক করেছেন যা এর উত্তরও দেয়।
বাছাই করা সংকলনে আপনি সম্ভবত অভ্যন্তরীণ ডেটা স্ট্রাকচারটি হেরফের করতে চান না যে কারণে অগ্রাধিকারকুই তালিকা ইন্টারফেসটি কার্যকর করে না (কারণ এটি আপনাকে এর উপাদানগুলিতে সরাসরি অ্যাক্সেস দেয়)।
পুনরাবৃত্তকারী উপর PriorityQueue
গুহা
PriorityQueue
বর্গ কার্যকরী Iterable<E>
এবং Collection<E>
ইন্টারফেস তাই এটি স্বাভাবিক হিসাবে iterated করা যেতে পারে। তবে, সাজানো ক্রমে পুনরুক্তিকারী উপাদানগুলি ফেরতের গ্যারান্টিযুক্ত নয়। পরিবর্তে (মন্তব্যগুলিতে অ্যালাদারথ যেমন উল্লেখ করেছেন) poll()
খালি হওয়া পর্যন্ত আপনার কাতারে থাকা দরকার ।
নোট করুন যে আপনি যে কোনও সংগ্রহ গ্রহণকারী কনস্ট্রাক্টরের মাধ্যমে একটি তালিকাটিকে অগ্রাধিকারের সারিতে রূপান্তর করতে পারেন :
List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");
PriorityQueue<String> sortedStrings = new PriorityQueue(strings);
while(!sortedStrings.isEmpty()) {
System.out.println(sortedStrings.poll());
}
// Prints out "cat" and "lol"
৪. নিজের SortedList
ক্লাস লিখুন
দ্রষ্টব্য: আপনার এটি করা উচিত নয়।
আপনি নিজের তালিকা ক্লাসটি লিখতে পারেন যা প্রতিবার নতুন উপাদান যুক্ত করলে তা সাজায়। এটি আপনার প্রয়োগের উপর নির্ভর করে ভারী গণনা ভারী পেতে পারে এবং এটি দুটি অর্থের কারণেই আপনি ব্যায়াম হিসাবে না করতে চাইলে তা অর্থহীন :
- এটি
List<E>
ইন্টারফেসের সাথে চুক্তি ভঙ্গ করে কারণadd
পদ্ধতিগুলি নিশ্চিত করা উচিত যে ব্যবহারকারী সূচকটিতে উপাদানটি থাকবে।
- চাকা পুনরুদ্ধার কেন? আপনার উপরের প্রথম পয়েন্টে উল্লিখিত পরিবর্তে আপনার ট্রিসেট বা মাল্টিসেটগুলি ব্যবহার করা উচিত।
তবে আপনি যদি অনুশীলন হিসাবে এটি করতে চান তবে এখানে শুরু করার জন্য একটি কোড নমুনা, এটি AbstractList
বিমূর্ত শ্রেণি ব্যবহার করে :
public class SortedList<E> extends AbstractList<E> {
private ArrayList<E> internalList = new ArrayList<E>();
// Note that add(E e) in AbstractList is calling this one
@Override
public void add(int position, E e) {
internalList.add(e);
Collections.sort(internalList, null);
}
@Override
public E get(int i) {
return internalList.get(i);
}
@Override
public int size() {
return internalList.size();
}
}
মনে রাখবেন যে আপনি যদি প্রয়োজনীয় পদ্ধতিগুলি ওভাররাইড না করে থাকেন তবে ডিফল্ট প্রয়োগগুলি গুলি AbstractList
ছুঁড়ে দেবে UnsupportedOperationException
।