উত্তর:
এটি খুব দেরীতে আসে, তবে জেডিকেতে কেবল একটি বাছাই করা তালিকার উদ্দেশ্যে একটি ক্লাস রয়েছে। এটির নাম দেওয়া হয়েছে (অন্যান্য Sorted*
ইন্টারফেসগুলির সাথে কিছুটা অর্ডারের বাইরে ) " java.util.PriorityQueue
"। এটি হয় Comparable<?>
গুলি বা একটি ব্যবহার করে বাছাই করতে পারেন Comparator
।
List
বাছাই করে ব্যবহারের সাথে পার্থক্য Collections.sort(...)
হ'ল এটি সর্বদা আংশিক ক্রম বজায় রাখবে, ও (লগ (এন)) সন্নিবেশ কর্মক্ষমতা সহ, একটি হিপ ডেটা কাঠামো ব্যবহার করে, যেখানে সাজানোতে সন্নিবেশ করা ArrayList
হবে ও (এন) (যেমন, বাইনারি অনুসন্ধান এবং সরানো ব্যবহার করে)।
তবে, এর বিপরীতে List
, PriorityQueue
সূচকযুক্ত অ্যাক্সেস ( get(5)
) সমর্থন করে না , গাদা হয়ে আইটেমগুলি অ্যাক্সেস করার একমাত্র উপায় হ'ল একবারে এটি বের করে নেওয়া (এভাবে নাম PriorityQueue
)।
TreeMap এবং TreeSet আপনাকে সাজানো ক্রমে সামগ্রীর উপর একটি পুনরাবৃত্তি দেবে। অথবা আপনি একটি অ্যারেলিস্ট ব্যবহার করতে পারেন এবং এটি বাছাই করতে কালেকশন.সোর্ট () ব্যবহার করতে পারেন। এই সমস্ত ক্লাস java.util এ রয়েছে
যদি আপনি একটি সাজানো তালিকা বজায় রাখতে চান যা আপনি প্রায়শই সংশোধন করবেন (যেমন একটি কাঠামো যা সাজানো ছাড়াও ডুপ্লিকেটকে অনুমতি দেয় এবং যার উপাদানগুলি সূচক দ্বারা দক্ষতার সাথে উল্লেখ করা যেতে পারে), তবে একটি অ্যারেলিস্ট ব্যবহার করুন তবে যখন আপনাকে কোনও উপাদান সন্নিবেশ করা দরকার , আপনি যে সূচকটিতে কোনও প্রদত্ত উপাদান যুক্ত করেছেন তা নির্ধারণ করতে সর্বদা কালেকশনস.বাইনারি অনুসন্ধান () ব্যবহার করুন। পরের পদ্ধতিটি আপনাকে সূচিটি বলেছে যাতে আপনার তালিকাটি বাছাই করে রাখতে sertোকাতে হবে।
গুগল পেয়ারার ট্রিমলটিসেট ক্লাস ব্যবহার করুন । পেয়ারাতে দর্শনীয় সংগ্রহের এপিআই রয়েছে।
বাছাই করা অর্ডার বজায় রাখে তালিকার একটি বাস্তবায়ন সরবরাহের ক্ষেত্রে একটি সমস্যা হ'ল add()
পদ্ধতির জাভডোকগুলিতে করা প্রতিশ্রুতি ।
List
সর্বদা শেষে যুক্ত হয়।
কয়েকটি অপশন আছে। আমি ট্রিসেটের পরামর্শ দিচ্ছি যদি আপনি সদৃশ না চান এবং যে জিনিসগুলি আপনি সন্নিবেশ করিয়েছেন তা তুলনামূলক হয়।
এটি করার জন্য আপনি সংগ্রহ শ্রেণীর স্থিত পদ্ধতিগুলিও ব্যবহার করতে পারেন।
আরও তথ্যের জন্য সংগ্রহ # সাজানোর (java.util.List) এবং ট্রিসেট দেখুন।
আপনি যদি কেবল একটি তালিকা বাছাই করতে চান তবে যে কোনও ধরণের তালিকা ব্যবহার করুন এবং সংগ্রহ.সোর্ট () ব্যবহার করুন । আপনি তালিকার মধ্যে নিশ্চিত উপাদান অনন্য এবং সবসময় সাজানো হয় করতে চাই, তাহলে একটি ব্যবহার SortedSet ।
আমি যা করেছি তা হ'ল তালিকাটি বাস্তবায়িত করা হ'ল সমস্ত পদ্ধতি নির্ধারণের সাথে অভ্যন্তরীণ উদাহরণ রয়েছে।
public class ContactList implements List<Contact>, Serializable {
private static final long serialVersionUID = -1862666454644475565L;
private final List<Contact> list;
public ContactList() {
super();
this.list = new ArrayList<Contact>();
}
public ContactList(List<Contact> list) {
super();
//copy and order list
List<Contact>aux= new ArrayList(list);
Collections.sort(aux);
this.list = aux;
}
public void clear() {
list.clear();
}
public boolean contains(Object object) {
return list.contains(object);
}
এর পরে, আমি একটি নতুন পদ্ধতি "পুটআর্ডার্ড" প্রয়োগ করেছি যা উপাদান উপস্থিত না থাকলে সঠিক অবস্থানে সন্নিবেশ করে বা কেবল এটি উপস্থিত থাকলে প্রতিস্থাপন করে।
public void putOrdered(Contact contact) {
int index=Collections.binarySearch(this.list,contact);
if(index<0){
index= -(index+1);
list.add(index, contact);
}else{
list.set(index, contact);
}
}
আপনি যদি পুনরাবৃত্ত উপাদানগুলিকে মঞ্জুরি দিতে চান তবে পরিবর্তে (বা উভয়) অ্যাডঅর্ডার্ড প্রয়োগ করুন।
public void addOrdered(Contact contact) {
int index=Collections.binarySearch(this.list,contact);
if(index<0){
index= -(index+1);
}
list.add(index, contact);
}
আপনি যদি সন্নিবেশগুলি এড়াতে চান তবে আপনি "অ্যাড" এবং "সেট" পদ্ধতিতে অপ্রয়োজনীয় অপারেশনটিও ছুঁড়ে ফেলতে এবং অপসারণ করতে পারেন।
public boolean add(Contact object) {
throw new UnsupportedOperationException("Use putOrdered instead");
}
... এবং এছাড়াও আপনাকে তালিকাভুক্তকারী পদ্ধতিগুলির সাথে যত্নবান হতে হবে কারণ তারা আপনার অভ্যন্তরীণ তালিকাকে সংশোধন করতে পারে। এই ক্ষেত্রে আপনি অভ্যন্তরীণ তালিকার একটি অনুলিপি ফিরিয়ে দিতে বা আবার একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন।
public ListIterator<Contact> listIterator() {
return (new ArrayList<Contact>(list)).listIterator();
}
List
চুক্তি লঙ্ঘন করে । শুধুমাত্র এটি প্রয়োগ করা ভাল হবে Collection
। এবং যদি ContactList
বাছাই করা হয় তবে আরও কার্যকর হওয়ার সাথে সাথে contains()
ব্যবহার করে প্রয়োগ করা যেতে পারে can binarySearch
আপনার পছন্দ অনুসারে বাছাই করা তালিকা কার্যকর করার সর্বাধিক দক্ষ উপায় হ'ল এখানে হিসাবে ইনডেক্সযোগ্য স্কিপলিস্ট প্রয়োগ করা: উইকিপিডিয়া: ইনডেক্সেবল স্কিপলিস্ট । এটি ও (লগ (এন)) এ সন্নিবেশ / অপসারণের অনুমতি দেবে এবং একই সাথে সূচিকৃত অ্যাক্সেসের অনুমতি দেবে। এবং এটি সদৃশও অনুমতি দেয়।
স্কিপলিস্ট একটি আকর্ষণীয় এবং আমি বলব, আন্ডাররেটেড ডেটা স্ট্রাকচার। দুর্ভাগ্যক্রমে জাভা বেস লাইব্রেরিতে কোনও সূচিবদ্ধ স্কিপলিস্ট বাস্তবায়ন নেই তবে আপনি ওপেন সোর্স বাস্তবায়নগুলির একটি ব্যবহার করতে পারেন বা এটি নিজেই প্রয়োগ করতে পারেন। মত নিয়মিত Skiplist বাস্তবায়নের হয় ConcurrentSkipListSet এবং ConcurrentSkipListMap
ট্রিসেট কাজ করবে না কারণ তারা সদৃশদের অনুমতি দেয় না এবং তারা নির্দিষ্ট অবস্থানে উপাদান আনতে পদ্ধতি সরবরাহ করে না। অগ্রাধিকারের কিউ কাজ করবে না কারণ এটি নির্দিষ্ট অবস্থানে থাকা উপাদানগুলি আনতে দেয় না যা তালিকার একটি প্রাথমিক প্রয়োজন। আমি মনে করি আপনার জাভির ওপ (লগন) সন্নিবেশের সময় সহ জাভাতে বাছাই করা তালিকা বজায় রাখতে আপনার নিজের অ্যালগরিদমটি প্রয়োগ করা দরকার, যদি না আপনি ডুপ্লিকেটগুলির প্রয়োজন না হন। কোনও সমাধানটি একটি ট্রিআম্যাপ ব্যবহার করতে পারে যেখানে কীটি সমান পদ্ধতিটিকে ওভাররাইড করে আইটেমটির একটি সাবক্লাস হয় যাতে নকলকে অনুমতি দেওয়া হয়।
আপনি যদি জাভা 8 এর পূর্ববর্তী সংস্করণ ব্যবহার করেন তবে ল্যাম্বডজে দিয়ে এই কাজগুলি সমাধান করার চেষ্টা করতে পারেন আপনি এখানে এটি খুঁজে পেতে পারেন: http://code.google.com/p/lambdaj/
এখানে আপনার একটি উদাহরণ রয়েছে:
সাজান Iterative
List<Person> sortedByAgePersons = new ArrayList<Person>(persons);
Collections.sort(sortedByAgePersons, new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return Integer.valueOf(p1.getAge()).compareTo(p2.getAge());
}
});
ল্যাম্বদাজে দিয়ে বাছাই করুন
List<Person> sortedByAgePersons = sort(persons, on(Person.class).getAge());
অবশ্যই, পারফরম্যান্সে এই ধরণের সৌন্দর্যের প্রভাব রয়েছে (গড়ে ২ বার), তবে আপনি আরও পাঠযোগ্য কোড খুঁজে পেতে পারেন?
Collections.sort(persons, (p1, p2) -> p1.getAge().compareTo(p2.getAge()));
//or
persons.sort((p1, p2) -> p1.getAge().compareTo(p2.getAge()));
-(p1.getAge().compareTo(p2.getAge()))
অগ্রাধিকারের কিউয়ের সমস্যাটি হ'ল এটিকে একটি সাধারণ অ্যারে দ্বারা ব্যাক আপ করা হয়, এবং যুক্তিগুলি যে ক্রমে উপাদানগুলি পায় তা "কাতারে [2 * এন + 1] এবং কাতারে [2 * (এন + 1)]" আইটকি দ্বারা সম্পন্ন হয়। আপনি যদি কেবল মাথা থেকে টানেন তবে এটি দুর্দান্ত কাজ করে তবে আপনি যদি কোনও সময়ে .toArray এ কল করার চেষ্টা করছেন তবে এটিকে অকেজো করে তোলে।
আমি com.google.common.collect.TreeM Multimamap ব্যবহার করে এই সমস্যাটি ঘুরে দেখি, তবে আমি মানগুলির জন্য একটি কাস্টম তুলক সরবরাহ করি, একটি আদেশে মোড়ানো, যা কখনই 0 দেয় না।
প্রাক্তন। ডাবল জন্য:
private static final Ordering<Double> NoEqualOrder = Ordering.from(new Comparator<Double>() {
@Override
public int compare(Double d1, Double d2)
{
if (d1 < d2) {
return -1;
}
else {
return 1;
}
}
});
আমি .toArray () এ কল করার সময় এই মানগুলি যথাযথভাবে পেয়েছি এবং এতে সদৃশও রয়েছে।
আপনি যা চান তা বাইনারি অনুসন্ধানের গাছ। অনুসন্ধান, অপসারণ এবং সন্নিবেশগুলির জন্য লগারিদমিক অ্যাক্সেসের প্রস্তাব দেওয়ার সময় এটি বাছাই করা ক্রম বজায় রাখে (যদি না আপনার অবনমিত গাছ থাকে - তবে এটি লিনিয়ার)। এটি বাস্তবায়ন করা বেশ সহজ এবং আপনি এমনকি এটি তালিকা ইন্টারফেস প্রয়োগ করতে পারেন তবে সূচী-অ্যাক্সেস জটিল হয়ে যায়।
দ্বিতীয় পদ্ধতির একটি অ্যারেলিস্ট এবং তারপরে একটি বুদ্বুদ সাজানোর বাস্তবায়ন implementation আপনি একবারে একটি উপাদান সন্নিবেশ করানো বা অপসারণ করার কারণে, সন্নিবেশ এবং অপসারণের অ্যাক্সেসের সময়গুলি লিনিয়ার। অনুসন্ধানগুলি লোগারিথমিক এবং সূচক অ্যাক্সেস ধ্রুবক (লিঙ্কডলিস্টের জন্য সময়গুলি বিভিন্ন হতে পারে)। আপনার কেবলমাত্র কোডটি 5 টি, সম্ভবত বুদ্বুদ সাজানোর 6 লাইন।
আপনি অ্যারেলিস্ট এবং ট্রিম্যাপ ব্যবহার করতে পারেন, যেমন আপনি বলেছিলেন যে আপনি পুনরাবৃত্তি মানগুলি চান তবে আপনি ট্রিসেট ব্যবহার করতে পারবেন না, যদিও এটি পাশাপাশি বাছাই করা হয়েছে তবে আপনাকে তুলনাকারী নির্ধারণ করতে হবে।
সেটের জন্য আপনি ট্রিসেট ব্যবহার করতে পারেন। ট্রিসেট প্রাকৃতিক অর্ডারিং বা কোনও নির্দিষ্ট বাছাইয়ের আদেশের ভিত্তিতে উপাদানটিকে আদেশ করে যে নির্দিষ্ট বস্তুর তুলনায় তুলনামূলকভাবে পাস হয়েছে। মানচিত্রের জন্য ট্রিম্যাপ ব্যবহার করুন। TreeMap কী বাছাই উপর কী সরবরাহ করে। ট্রিম্যাপে কী হিসাবে কোনও বস্তু যুক্ত করার জন্য শ্রেণীর তুলনামূলক ইন্টারফেস প্রয়োগ করা উচিত যা পরিবর্তনের আদেশের সংজ্ঞা সংযুক্ত () পদ্ধতির সাথে তুলনামূলক প্রয়োগ করতে বাধ্য করে। http://techmastertutorial.in/java-collection-impl.html
নীচে হিসাবে তালিকাটি সাজানোর জন্য বাছাই () পদ্ধতিটি ব্যবহার করুন:
List list = new ArrayList();
//add elements to the list
Comparator comparator = new SomeComparator();
Collections.sort(list, comparator);
রেফারেন্সের জন্য লিঙ্কটি দেখুন: http://tutorials.jenkov.com/java-collections/sorting.html
TreeSet
সাজান ক্রমে উপাদান দেয় যা ব্যবহার করুন । বা এর Collection.sort()
সাথে বাহ্যিক বাছাইয়ের জন্য ব্যবহার করুন Comparator()
।
import java.util.TreeSet;
public class Ass3 {
TreeSet<String>str=new TreeSet<String>();
str.add("dog");
str.add("doonkey");
str.add("rat");
str.add("rabbit");
str.add("elephant");
System.out.println(str);
}
জাভা 8 কম্পেটারের সাথে যদি আমরা তালিকাটি বাছাই করতে চাই তবে এখানে বিশ্বের 10 জনবহুল শহর রয়েছে এবং আমরা এটি নাম অনুসারে বাছাই করতে চাই, সময় অনুসারে। ওসাকা, জাপান ... মেক্সিকো সিটি, মেক্সিকো. ... বেইজিং, চীন. ... সাও পাওলো, ব্রাজিল. ... মুম্বই, ভারত। ... সাংহাই, চীন. ... দিল্লি, ভারত। ... টোকিও, জাপান.
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class SortCityList {
/*
* Here are the 10 most populated cities in the world and we want to sort it by
* name, as reported by Time. Osaka, Japan. ... Mexico City, Mexico. ...
* Beijing, China. ... São Paulo, Brazil. ... Mumbai, India. ... Shanghai,
* China. ... Delhi, India. ... Tokyo, Japan.
*/
public static void main(String[] args) {
List<String> cities = Arrays.asList("Osaka", "Mexico City", "São Paulo", "Mumbai", "Shanghai", "Delhi",
"Tokyo");
System.out.println("Before Sorting List is:-");
System.out.println(cities);
System.out.println("--------------------------------");
System.out.println("After Use of List sort(String.CASE_INSENSITIVE_ORDER) & Sorting List is:-");
cities.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println(cities);
System.out.println("--------------------------------");
System.out.println("After Use of List sort(Comparator.naturalOrder()) & Sorting List is:-");
cities.sort(Comparator.naturalOrder());
System.out.println(cities);
}
}
ব্যবহারকারীর সংজ্ঞায়িত মানদণ্ড অনুসারে একটি অ্যারেলিস্ট বাছাই করা।
মডেল ক্লাস
class Student
{
int rollno;
String name, address;
public Student(int rollno, String name, String address)
{
this.rollno = rollno;
this.name = name;
this.address = address;
}
public String toString()
{
return this.rollno + " " + this.name + " " + this.address;
}
}
বাছাই ক্লাস
class Sortbyroll implements Comparator<Student>
{
public int compare(Student a, Student b)
{
return a.rollno - b.rollno;
}
}
মেইন ক্লাস
class Main
{
public static void main (String[] args)
{
ArrayList<Student> ar = new ArrayList<Student>();
ar.add(new Student(111, "bbbb", "london"));
ar.add(new Student(131, "aaaa", "nyc"));
ar.add(new Student(121, "cccc", "jaipur"));
System.out.println("Unsorted");
for (int i=0; i<ar.size(); i++)
System.out.println(ar.get(i));
Collections.sort(ar, new Sortbyroll());
System.out.println("\nSorted by rollno");
for (int i=0; i<ar.size(); i++)
System.out.println(ar.get(i));
}
}
আউটপুট
Unsorted
111 bbbb london
131 aaaa nyc
121 cccc jaipur
Sorted by rollno
111 bbbb london
121 cccc jaipur
131 aaaa nyc