জাভা কেন Comparable
ব্যবহার করা হয়? কেন কেউ Comparable
ক্লাসে বাস্তবায়ন করবে ? বাস্তবের তুলনামূলক বাস্তবায়ন করতে গেলে আপনার বাস্তব উদাহরণটি কী?
জাভা কেন Comparable
ব্যবহার করা হয়? কেন কেউ Comparable
ক্লাসে বাস্তবায়ন করবে ? বাস্তবের তুলনামূলক বাস্তবায়ন করতে গেলে আপনার বাস্তব উদাহরণটি কী?
উত্তর:
এখানে একটি বাস্তব জীবনের নমুনা। নোট যে String
প্রয়োগ করে Comparable
।
class Author implements Comparable<Author>{
String firstName;
String lastName;
@Override
public int compareTo(Author other){
// compareTo should return < 0 if this is supposed to be
// less than other, > 0 if this is supposed to be greater than
// other and 0 if they are supposed to be equal
int last = this.lastName.compareTo(other.lastName);
return last == 0 ? this.firstName.compareTo(other.firstName) : last;
}
}
পরে ..
/**
* List the authors. Sort them by name so it will look good.
*/
public List<Author> listAuthors(){
List<Author> authors = readAuthorsFromFileOrSomething();
Collections.sort(authors);
return authors;
}
/**
* List unique authors. Sort them by name so it will look good.
*/
public SortedSet<Author> listUniqueAuthors(){
List<Author> authors = readAuthorsFromFileOrSomething();
return new TreeSet<Author>(authors);
}
last
?
তুলনীয় একটি প্রাকৃতিক ক্রম সংজ্ঞায়িত করে। এর অর্থ হ'ল আপনি যখন এটির সংজ্ঞা দিচ্ছেন তখন যখন কোনও বস্তুকে "কম" বা "এর চেয়ে বড়" হিসাবে বিবেচনা করা উচিত।
মনে করুন আপনার কাছে বেশ কয়েকটি সংখ্যক পূর্ণসংখ্যা রয়েছে এবং আপনি সেগুলি বাছাই করতে চান। এটি বেশ সহজ, কেবল তাদের সাজানো সংগ্রহে রাখুন, তাই না?
TreeSet<Integer> m = new TreeSet<Integer>();
m.add(1);
m.add(3);
m.add(2);
for (Integer i : m)
... // values will be sorted
তবে এখন ধরুন আমার কাছে কিছু কাস্টম অবজেক্ট রয়েছে, যেখানে বাছাই করা আমার কাছে অর্থবোধ করে তবে এটি অপরিবর্তিত। বলুন, আমার কাছে জনসংখ্যার ঘনত্বের সাথে জিপকোড দ্বারা জেলাগুলির প্রতিনিধিত্বকারী ডেটা রয়েছে এবং আমি তাদের ঘনত্ব অনুসারে বাছাই করতে চাই:
public class District {
String zipcode;
Double populationDensity;
}
এখন তাদের সাজানোর সহজতম উপায় হল তুলনামূলক বাস্তবায়ন করে প্রাকৃতিক ক্রম দিয়ে তাদের সংজ্ঞা দেওয়া, যার অর্থ এই বিষয়গুলি অর্ডার করার জন্য একটি স্ট্যান্ডার্ড উপায় রয়েছে:
public class District implements Comparable<District>{
String zipcode;
Double populationDensity;
public int compareTo(District other)
{
return populationDensity.compareTo(other.populationDensity);
}
}
মনে রাখবেন যে তুলনামূলক সংজ্ঞা দিয়ে আপনি সমতুল্য কাজটি করতে পারেন। পার্থক্যটি হল যে তুলনামূলকটি বস্তুর বাইরে ক্রম যুক্তিকে সংজ্ঞায়িত করে । হতে পারে একটি পৃথক প্রক্রিয়াতে আমাকে একই জিনিসগুলিকে জিপকোড দ্বারা অর্ডার করতে হবে - সেক্ষেত্রে ক্রমটি অর্ডার করা অবজেক্টের কোনও সম্পত্তি নয় বা প্রাকৃতিক ক্রমবর্ধমান বস্তু থেকে পৃথক। আপনি পূর্ণসংখ্যার উপর একটি কাস্টম অর্ডারিং সংজ্ঞায়িত করতে একটি বাহ্যিক তুলক ব্যবহার করতে পারেন, উদাহরণস্বরূপ তাদের বর্ণমালিক মান অনুসারে বাছাই করে।
মূলত অর্ডারিং লজিকের কোথাও কোথাও উপস্থিতি থাকতে হবে। এটা হতে পারে -
অবজেক্টে নিজেই, যদি এটি প্রাকৃতিকভাবে তুলনামূলক হয় (তুলনীয়-ইগ পূর্ণসংখ্যার প্রসারিত হয়)
বাহ্যিক তুলনামূলক সরবরাহ করা যেমন উপরের উদাহরণ হিসাবে।
TreeSet<Integer>
পরিবর্তে এটি থাকতে হবে TreeMap<Integer>
, কারণ পরবর্তীগুলির অস্তিত্ব নেই, ট্রিম্যাপগুলি সর্বদা- <Key,Value>
জোড়া হয়। বিটিডব্লিউ, একটি অনুমানকরা TreeMap<District, Object>
কেবল তখনই কাজ করবে, যদি জেলা তুলনামূলক বাস্তবায়িত হয়, তাই না? এখনও এটি বোঝার চেষ্টা করছি
জাভাডোক থেকে উদ্ধৃত;
এই ইন্টারফেসটি প্রতিটি শ্রেণীর বস্তুগুলিতে এটি প্রয়োগ করে মোট ক্রম চাপায়। এই ক্রমটিকে শ্রেণীর প্রাকৃতিক ক্রম হিসাবে চিহ্নিত করা হয় এবং শ্রেণীর তুলনা করার পদ্ধতিটিকে তার প্রাকৃতিক তুলনা পদ্ধতি হিসাবে উল্লেখ করা হয়।
এই ইন্টারফেসটি প্রয়োগ করে এমন অবজেক্টের তালিকা (এবং অ্যারেগুলি) কালেকশন.সোর্ট (এবং অ্যারেস.সোর্ট) দ্বারা স্বয়ংক্রিয়ভাবে বাছাই করা যেতে পারে। এই ইন্টারফেসটি বাস্তবায়নকারী অবজেক্টগুলি কোনও তুলনাকারী নির্দিষ্টকরণের প্রয়োজন ছাড়াই বাছাই করা মানচিত্রের চাবি বা বাছাই করা সেটগুলিতে উপাদান হিসাবে ব্যবহার করা যেতে পারে।
সম্পাদনা: .. এবং গুরুত্বপূর্ণ বিট সাহসী করেছে।
কোনও শ্রেণি প্রয়োগ করে এমন Comparable
অর্থ হ'ল আপনি সেই শ্রেণি থেকে দুটি বস্তু নিতে এবং তাদের তুলনা করতে পারেন। কিছু ক্লাস যেমন নির্দিষ্ট সংকলনের মতো (কোনও সংগ্রহের মধ্যে বাছাইয়ের ফাংশন) যা বস্তুগুলি তুলনীয় হওয়ার জন্য তাদের উপর নির্ভর করে রাখে (সাজানোর জন্য আপনাকে কোন জিনিসটি "বৃহত্তম" এবং আরও অনেক কিছু আছে তা জানতে হবে)।
উপরের বেশিরভাগ উদাহরণগুলি দেখায় যে কীভাবে তুলনাযোগ্য কার্যে বিদ্যমান তুলনামূলক অবজেক্টটি পুনরায় ব্যবহার করতে হয়। আপনি যদি একই শ্রেণীর দুটি বস্তুর তুলনা করতে চান তবে আপনি নিজের তুলনাটি প্রয়োগ করতে চান, একটি এয়ারলাইনটিকিট অবজেক্টটি বলুন যে আপনি দাম অনুসারে বাছাই করতে চান (কম প্রথমে র্যাঙ্কিং), তারপরে স্টপওভারের সংখ্যা (আবার কম) প্রথম স্থান), আপনি নিম্নলিখিত করতে হবে:
class AirlineTicket implements Comparable<Cost>
{
public double cost;
public int stopovers;
public AirlineTicket(double cost, int stopovers)
{
this.cost = cost; this.stopovers = stopovers ;
}
public int compareTo(Cost o)
{
if(this.cost != o.cost)
return Double.compare(this.cost, o.cost); //sorting in ascending order.
if(this.stopovers != o.stopovers)
return this.stopovers - o.stopovers; //again, ascending but swap the two if you want descending
return 0;
}
}
একাধিক ক্ষেত্রের তুলনা বাস্তবায়নের একটি সহজ উপায় হল পেয়ারার তুলনাচাইনের সাথে - তবে আপনি বলতে পারেন
public int compareTo(Foo that) {
return ComparisonChain.start()
.compare(lastName, that.lastName)
.compare(firstName, that.firstName)
.compare(zipCode, that.zipCode)
.result();
}
পরিবর্তে
public int compareTo(Person other) {
int cmp = lastName.compareTo(other.lastName);
if (cmp != 0) {
return cmp;
}
cmp = firstName.compareTo(other.firstName);
if (cmp != 0) {
return cmp;
}
return Integer.compare(zipCode, other.zipCode);
}
}
উদাহরণস্বরূপ যখন আপনি একটি বাছাই করা সংগ্রহ বা মানচিত্র রাখতে চান
তুলনীয় আপনার শ্রেণীর উদাহরণগুলির তুলনা করতে ব্যবহৃত হয়। উদাহরণস্বরূপ আমরা বিভিন্ন উপায়ে তুলনা করতে পারি যে কারণে উদাহরণস্বরূপ আমরা compareTo
কীভাবে (গুণাবলী) তুলনা করতে চাই তা জানতে একটি পদ্ধতি প্রয়োগ করা দরকার ।
Dog
শ্রেণী:package test;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Dog d1 = new Dog("brutus");
Dog d2 = new Dog("medor");
Dog d3 = new Dog("ara");
Dog[] dogs = new Dog[3];
dogs[0] = d1;
dogs[1] = d2;
dogs[2] = d3;
for (int i = 0; i < 3; i++) {
System.out.println(dogs[i].getName());
}
/**
* Output:
* brutus
* medor
* ara
*/
Arrays.sort(dogs, Dog.NameComparator);
for (int i = 0; i < 3; i++) {
System.out.println(dogs[i].getName());
}
/**
* Output:
* ara
* medor
* brutus
*/
}
}
Main
শ্রেণী:package test;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Dog d1 = new Dog("brutus");
Dog d2 = new Dog("medor");
Dog d3 = new Dog("ara");
Dog[] dogs = new Dog[3];
dogs[0] = d1;
dogs[1] = d2;
dogs[2] = d3;
for (int i = 0; i < 3; i++) {
System.out.println(dogs[i].getName());
}
/**
* Output:
* brutus
* medor
* ara
*/
Arrays.sort(dogs, Dog.NameComparator);
for (int i = 0; i < 3; i++) {
System.out.println(dogs[i].getName());
}
/**
* Output:
* ara
* medor
* brutus
*/
}
}
জাভাতে তুলনীয় কীভাবে ব্যবহার করবেন তা এখানে একটি ভাল উদাহরণ:
http://www.onjava.com/pub/a/onjava/2003/03/12/java_comp.html?page=2
আপনি যখন Comparable
ইন্টারফেসটি প্রয়োগ করেন , আপনাকে পদ্ধতিটি প্রয়োগ করতে হবে compareTo()
। আপনার প্রয়োজন বস্তুর তুলনা করতে, ব্যবহার করার জন্য, উদাহরণস্বরূপ, ArrayList
ক্লাসের পদ্ধতি বাছাইকরণ । আপনার জিনিসগুলি বাছাই করতে সক্ষম হওয়ার জন্য আপনার সাথে তুলনা করার একটি উপায় প্রয়োজন। সুতরাং compareTo()
আপনার ক্লাসে আপনার একটি কাস্টম পদ্ধতি প্রয়োজন যাতে আপনি এটি ArrayList
বাছাই পদ্ধতি সহ ব্যবহার করতে পারেন । compareTo()
পদ্ধতি আয় -1,0,1।
আমি সবেমাত্র জাভা হেড ২.০ তে একটি অনুচ্ছেদটি পড়েছি, আমি এখনও শিখছি।
ঠিক আছে, তবে compareTo()
তুলনীয় ইন্টারফেস বাস্তবায়ন না করে কেন কেবল কোনও পদ্ধতির সংজ্ঞা দেওয়া হবে না । উদাহরণস্বরূপ, এর City
দ্বারা নির্ধারিত একটি শ্রেণি name
এবং temperature
এবং
public int compareTo(City theOther)
{
if (this.temperature < theOther.temperature)
return -1;
else if (this.temperature > theOther.temperature)
return 1;
else
return 0;
}