তুলনা () এবং তুলনা টো () এর মধ্যে পার্থক্য কী?


110

জাভা compare()এবং compareTo()পদ্ধতিগুলির মধ্যে পার্থক্য কী ? এই পদ্ধতিগুলি কি একই উত্তর দেয়?


1
কোনটি ক্লাস মেথোডের সাথে তুলনা করেন?
মার্কাস লসবার্গ 13

তুলনা () এবং তুলনা উভয়ের ব্যবহারের বিশদ ব্যাখ্যার জন্য: sysdotoutdotprint.com/index.php/2017/03/28/…
mel3kings

উত্তর:


160

জাভা নোটগুলি থেকে :

  • a.compareTo(b):
    তুলনীয় ইন্টারফেস: মানগুলির তুলনা করে এবং এমন একটি পূর্বাবস্থায় ফেরত দেয় যা জানায় যে মানগুলি কম, সমান বা তার চেয়ে বড় তুলনা করে কিনা।
    আপনার শ্রেণি অবজেক্টগুলির যদি প্রাকৃতিক অর্ডার থাকে তবে Comparable<T>ইন্টারফেসটি প্রয়োগ করুন এবং এই পদ্ধতিটি সংজ্ঞায়িত করুন। সকল জাভা ক্লাস একটি প্রাকৃতিক ক্রম বাস্তবায়ন আছে Comparable<T>- উদাহরণ: String, রাপার শ্রেনীর ,BigInteger

  • compare(a, b):
    তুলনামূলক ইন্টারফেস: দুটি বস্তুর মানের তুলনা করে। এই অংশ হিসাবে বাস্তবায়িত হয় Comparator<T>ইন্টারফেস, এবং সাধারণত ব্যবহার যেমন পদ্ধতি পাস এক বা একাধিক ছোট ইউটিলিটি শ্রেণীর যে এই বাস্তবায়ন, নির্ধারণ করা হয় sort()বা এই ধরনের মত তথ্য কাঠামো বাছাই দ্বারা ব্যবহারের জন্য TreeMapএবংTreeSet । আপনি নিম্নলিখিতগুলির জন্য তুলনামূলক অবজেক্ট তৈরি করতে চাইতে পারেন:

    • একাধিক তুলনা । কিছু বাছাই করার বিভিন্ন উপায় প্রদান। উদাহরণস্বরূপ, আপনি নাম, আইডি, বয়স, উচ্চতা, দ্বারা কোনও ব্যক্তি শ্রেণি বাছাই করতে চাইতে পারেন ... sort()পদ্ধতিতে পাস করার জন্য আপনি প্রতিটিটির জন্য একটি তুলনাকারী নির্ধারণ করবেন ।
    • সিস্টেম ক্লাস যে শ্রেণীর উপর আপনার কোনও নিয়ন্ত্রণ নেই সেগুলির তুলনা করার পদ্ধতি সরবরাহ করা। উদাহরণস্বরূপ, আপনি স্ট্রিংগুলির জন্য তুলনাকারী নির্ধারণ করতে পারেন যা তাদের দৈর্ঘ্যের সাথে তুলনা করে।
    • কৌশল প্যাটার্ন স্ট্র্যাটেজি প্যাটার্ন প্রয়োগ করতে, এটি এমন একটি পরিস্থিতি যেখানে আপনি কোনও অ্যালগরিদমকে একটি অবজেক্ট হিসাবে প্রতিনিধিত্ব করতে চান যা আপনি প্যারামিটার হিসাবে পাস করতে পারেন, কোনও ডেটা স্ট্রাকচারে সংরক্ষণ করতে পারেন ইত্যাদি as

যদি আপনার শ্রেণি অবজেক্টগুলিতে একটি প্রাকৃতিক বাছাইয়ের ক্রম থাকে তবে আপনার তুলনা () প্রয়োজন হবে না।


Http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html থেকে সংক্ষিপ্তসার

তুলনীয়
একটি তুলনামূলক অবজেক্ট নিজেকে অন্য একটি বস্তুর সাথে তুলনা করতে সক্ষম।

Comparator
একটি comparator বস্তুর দুটি ভিন্ন বস্তু তুলনা করতে সক্ষম। শ্রেণিটি তার দৃষ্টান্তগুলির তুলনা করে না, তবে কিছু অন্যান্য শ্রেণির উদাহরণগুলির তুলনা করে।


কেস প্রসঙ্গে ব্যবহার করুন:

তুলনীয় ইন্টারফেস

পদ্ধতি এবং সমান ==এবং != অপারেটরদের সমতা / বৈষম্য জন্য পরীক্ষার কিন্তু আপেক্ষিক মানের জন্য পরীক্ষা করার জন্য একটি উপায় প্রদান করবেন না
কিছু ক্লাস (উদাহরণস্বরূপ, স্ট্রিং এবং প্রাকৃতিক ক্রম সহ অন্যান্য শ্রেণিগুলি) Comparable<T>ইন্টারফেস প্রয়োগ করে , যা একটি compareTo()পদ্ধতির সংজ্ঞা দেয় ।
আপনি যদি Comparable<T>আপনার ক্লাসে এটি প্রয়োগ করতে চান Collections.sort()বা কোনও Arrays.sort()পদ্ধতি ব্যবহার করতে চান তবে want

তুলনামূলক বস্তুর সংজ্ঞা দেওয়া হচ্ছে

যে কোনও শ্রেণীর জন্য যেকোন স্বেচ্ছাসেবী পদ্ধতিতে বাছাই করতে আপনি তুলনাকারী তৈরি করতে পারেন
উদাহরণস্বরূপ, Stringক্লাসটি CASE_INSENSITIVE_ORDERতুলনামূলক সংজ্ঞায়িত করে ।


দুটি পদ্ধতির মধ্যে পার্থক্যটি ধারণার সাথে যুক্ত করা যেতে পারে:
অর্ডার করা সংগ্রহ :

যখন কোনও সংগ্রহ অর্ডার করা হয়, এর অর্থ আপনি সংগ্রহের মধ্যে নির্দিষ্ট (অ-র্যান্ডম) ক্রমে (একটি Hashtableআদেশ নয়) can

প্রাকৃতিক অর্ডার সহ একটি সংগ্রহ কেবল অর্ডার করা হয় না, তবে সাজানো হয় । একটি প্রাকৃতিক আদেশ সংজ্ঞা দেওয়া কঠিন হতে পারে! ( প্রাকৃতিক স্ট্রিং ক্রম হিসাবে )।


আরেকটি পার্থক্য, সেই বিষয়টিই তুলে ধরেছিলেন HaveAGuess মধ্যে মন্তব্য :

  • Comparable প্রয়োগে রয়েছে এবং ইন্টারফেস থেকে দৃশ্যমান নয়, সুতরাং যখন আপনি সাজানোর সময় আপনি সত্যিই জানেন না যে কি ঘটতে চলেছে।
  • Comparator ক্রমটি নিশ্চিত করা হয়েছে যে আপনাকে আশ্বাস দেয়।

2
যেহেতু এই উত্তরটি সম্পূর্ণরূপে নয়, এখানে এমন কিছু যা আমাকে তুলনামূলক তুলনামূলক সম্পর্কে বিরক্ত করতে পারে যা আপনি যুক্ত করতে পছন্দ করতে পারেন: এটি বাস্তবায়নের মধ্যে রয়েছে এবং ইন্টারফেস থেকে দৃশ্যমান নয়, সুতরাং যখন আপনি সাজান আপনি সত্যই জানেন না যে কি ঘটতে চলেছে। একটি তুলনাকারী ব্যবহার করে আপনাকে আশ্বাস দেয় যে
অর্ডারটি যথাযথভাবে

নিবন্ধন করুন আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি।
ভনসি

অবজেক্টগুলির একটি প্রাকৃতিক অর্ডার রয়েছে, প্রাকৃতিক আদেশ এখানে কী বোঝায়? যেমন স্ট্রিং ডেটা মেম্বার যেমন কর্মচারী শ্রেণীর নামটির প্রাকৃতিক অর্ডার থাকে ??
নরেন্দ্র জাগি

@NarendraJaggi দেখুন en.wikipedia.org/wiki/Enumeration । একটি আদেশ যা গণনা সহজতর করে। "প্রাকৃতিক" এই অর্থে যে সূচক সেটটিতে প্রদত্ত
সুশৃঙ্খলা

2
@ ওয়েডেন্টকেকান আপনাকে ধন্যবাদ আমি এই উত্তরে 2 টি লিঙ্ক পুনরুদ্ধার করেছি।
ভনসি

16

compareTo()Comparableইন্টারফেস থেকে হয় ।

compare()Comparatorইন্টারফেস থেকে হয় ।

উভয় পদ্ধতি একই কাজ করে তবে প্রতিটি ইন্টারফেসটি কিছুটা ভিন্ন প্রসঙ্গে ব্যবহৃত হয়।

তুলনীয় ইন্টারফেস বাস্তবায়ন ক্লাসের বস্তুর উপর একটি প্রাকৃতিক ক্রম আরোপ করতে ব্যবহৃত হয়। compareTo()পদ্ধতি প্রাকৃতিক তুলনা পদ্ধতি বলা হয়। Comparator ইন্টারফেস বাস্তবায়ন ক্লাসের বস্তুর উপর মোট ক্রম আরোপ করতে ব্যবহৃত হয়। আরও তথ্যের জন্য, প্রতিটি ইন্টারফেসটি ঠিক কখন ব্যবহার করতে হবে তার লিঙ্কগুলি দেখুন।


আপনি কিছু উদাহরণ দিতে পারেন? উভয় পদ্ধতিই একই উত্তর দেয়?

আমি জানি না 'তুলনামূলক' প্রাকৃতিক অর্ডারের জন্য কেন? আমরা এটি কাস্টমাইজ করতে পারি, তাই না?
সি-

14

সাদৃশ্য:
উভয়ই দুটি বস্তুর তুলনা করার কাস্টম পদ্ধতি।
উভয়ই intদুটি বস্তুর মধ্যে সম্পর্কের বর্ণনা প্রদান করে।

পার্থক্য: পদ্ধতিটি compare()এমন একটি পদ্ধতি যা আপনি যদি Comparatorইন্টারফেসটি প্রয়োগ করেন তবে আপনাকে প্রয়োগ করতে বাধ্য ated এটি আপনাকে পদ্ধতিতে দুটি বস্তু পাস করার অনুমতি দেয় এবং এটি intতাদের সম্পর্কের বর্ণনা প্রদান করে।

Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);

পদ্ধতিটি compareTo()এমন একটি পদ্ধতি যা আপনি যদি Comparableইন্টারফেসটি প্রয়োগ করেন তবে আপনাকে প্রয়োগ করতে বাধ্য । এটি কোনও বস্তুকে অনুরূপ ধরণের অবজেক্টের সাথে তুলনা করতে সহায়তা করে।

String s = "hi";
int result = s.compareTo("bye");

সংক্ষিপ্তসার:
মূলত এগুলি জিনিসগুলির তুলনা করার দুটি ভিন্ন উপায়।


9

পদ্ধতিগুলির একই উত্তর দিতে হবে না। এটি নির্ভর করে আপনি কোন বস্তু / শ্রেণিগুলিকে তাদের কল করেছেন।

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

আপনি যদি এমন কোনও এপিআই থেকে কিছু ক্লাস ব্যবহার করছেন যা তুলনামূলক ইন্টারফেস বাস্তবায়ন করে না তবে আপনি এখনও তাদের তুলনা করতে চান। বাছাই করার জন্য। আপনি আপনার নিজস্ব শ্রেণি তৈরি করতে পারেন যা তুলনাকারী ইন্টারফেসটি প্রয়োগ করে এবং এর তুলনা () পদ্ধতিতে আপনি যুক্তি প্রয়োগ করেন।


3

তুলনীয় ইন্টারফেসে একটি পদ্ধতি বলা হয় compareTo(obj)যা কেবল একটি যুক্তি নেয় এবং এটি একই শ্রেণীর অন্য উদাহরণ বা বস্তুর সাথে নিজেকে তুলনা করে।

তুলনাকারী ইন্টারফেসে একটি পদ্ধতি বলা হয় compare(obj1,obj2)যা দুটি আর্গুমেন্ট নেয় এবং এটি একই বা বিভিন্ন শ্রেণীর দুটি বস্তুর মানের তুলনা করে।


3
compareTo(T object)

জাভা.লং.কম্পেবল ইন্টারফেস থেকে আসে, এই বস্তুর জন্য অন্যের সাথে তুলনা করতে প্রয়োগ করা হয় যার জন্য এই বস্তুর তুলনামূলক কম মান 0, সমান জন্য 0 বা অন্যটির চেয়ে বৃহত্তর জন্য ধনাত্মক মান প্রদান করে। এটি আরও সুবিধাজনক তুলনা পদ্ধতি, তবে আপনার তুলনা করতে চান এমন প্রতিটি শ্রেণিতে অবশ্যই প্রয়োগ করা উচিত।

compare(T obj1, T obj2)

java.util.Comparator ইন্টারফেস থেকে আসে, যা পৃথক শ্রেণিতে প্রয়োগ করা হয় যা অন্য শ্রেণীর অবজেক্টের সাথে তুলনা করে প্রথম বস্তুর জন্য aণাত্মক int মান প্রদান করে সমান জন্য 0, বা দ্বিতীয় বস্তুর চেয়ে বৃহত্তর জন্য ধনাত্মক মান দেয়। এটি প্রয়োজনীয় যখন আপনি কোনও ক্লাসি তুলনা তুলনা করতে পারবেন না () এটি পরিবর্তনযোগ্য নয়। আপনি কেবলমাত্র একটি নয় (যেমন নাম বা বয়সের মাধ্যমে) অবজেক্টের তুলনা করার বিভিন্ন উপায় চাইলে এটিও ব্যবহৃত হয়।


3

তুলনামূলক ব্যবহার করে, আমাদের কাছে ক্লাসের জন্য অনেকগুলি তুলনা যুক্তি থাকতে পারে

যেমন

কার ক্লাসের জন্য

গাড়ী মডেল নম্বরের উপর ভিত্তি করে তুলনা করার জন্য আমাদের তুলনাকারী ক্লাস থাকতে পারে। গাড়ী মডেল বছরের উপর ভিত্তি করে তুলনা করার জন্য আমরা একটি তুলনামূলক ক্লাসও রাখতে পারি।

গাড়ী ক্লাস

public class Car  {

    int modelNo;

    int modelYear;

    public int getModelNo() {
        return modelNo;
    }

    public void setModelNo(int modelNo) {
        this.modelNo = modelNo;
    }

    public int getModelYear() {
        return modelYear;
    }

    public void setModelYear(int modelYear) {
        this.modelYear = modelYear;
    }

}

মডেল নং এর উপর ভিত্তি করে তুলনা # 1

public class CarModelNoCompartor implements Comparator<Car>{

    public int compare(Car o1, Car o2) {

        return o1.getModelNo() - o2.getModelNo();
    }

}

তুলনামূলক মডেল বছর 2 ভিত্তিক

public class CarModelYearComparator implements Comparator<Car> {

    public int compare(Car o1, Car o2) {

        return o1.getModelYear() - o2.getModelYear();
    }

}

তুলনামূলক ইন্টারফেসের ক্ষেত্রে এটি সম্ভব নয় ।

তুলনামূলক ইন্টারফেসের ক্ষেত্রে, তুলনাযোগ্য () পদ্ধতিতে আমাদের কেবল একটি যুক্তি থাকতে পারে ।


2

এই পদ্ধতিটি এবং এর সহযোগীদের থাকা বস্তুর সম্পর্ক আলাদা different

compareTo()ইন্টারফেস তুলনীয় একটি পদ্ধতি , তাই এটি অন্য একটি সঙ্গে এই উদাহরণ তুলনা করতে ব্যবহৃত হয়।

compare()ইন্টারফেস তুলনাকারীর একটি পদ্ধতি , সুতরাং এটি অন্য শ্রেণীর দুটি পৃথক দৃষ্টান্ত একে অপরের সাথে তুলনা করতে ব্যবহৃত হয়।

আপনি যদি করেন, বাস্তবায়ন Comparableমানে শ্রেণীর উদাহরণগুলি সহজেই তুলনা করা যায়।
বাস্তবায়ন করার Comparatorঅর্থ, উদাহরণগুলি বিভিন্ন বস্তুর (অন্যান্য শ্রেণির) সাথে তুলনা করার জন্য উপযুক্ত।


2

মূল পার্থক্যটি ইন্টারফেসগুলির ব্যবহারের মধ্যে রয়েছে:

তুলনীয় (যার তুলনা টো () রয়েছে সেই ইন্টারফেসটি বাস্তবায়নের জন্য বস্তুগুলির তুলনা করতে (ট্রিম্যাপ ব্যবহার করার জন্য, বা একটি তালিকা সাজানোর জন্য) প্রয়োজন) তবে কি যদি ক্লাসটি তুলনামূলক বাস্তবায়ন না করে এবং আপনি এটি পরিবর্তন করতে না পারেন কারণ এটি তৃতীয় পক্ষের লাইব্রেরির অংশ? তারপরে আপনাকে একটি তুলনামূলক প্রয়োগ করতে হবে, যা ব্যবহার করতে কিছুটা কম সুবিধাজনক।


2

compareTo()একে অন্য অবজেক্টের সাথে তুলনা করার জন্য একটি অবজেক্টকে ডাকা হয়। compare()অন্য দুটি অবজেক্টের তুলনা করার জন্য কোনও অবজেক্টকে ডাকা হয়।

পার্থক্যটি যেখানে আসল তুলনা করে এমন যুক্তিকে সংজ্ঞায়িত করা হয়।


আমি যা চমত্কার উত্তর বলব তা নয়, তবে আমি মনে করি এটি একটি ডাউনটাউটের যোগ্য।
পল টমলিন 13

সম্মত, ব্যক্তিগতভাবে আমি ভুল বা বিভ্রান্তিকর উত্তরের জন্য ডাউনভোটগুলি সংরক্ষণ করি। এটি অবশ্যই সঠিক।
জোছিম সউর 13

তাহলে সেই 'বন্ধুত্বপূর্ণ' লোকেরা কোথায় আছে যারা আমাকে নীচু করে? এটি আমার দ্বিতীয় সঠিক উত্তর যা ডাউনটোটেড ছিল কারণ কেউ পয়েন্টটি মিস করেছে। হয় ডাউনভোটিং এর পয়েন্ট বা আমার উত্তরের পয়েন্ট। জীবনের এত নিষ্ঠুর .. ;-)
আবগান

0

যখন আপনি একটি তালিকা বাছাই করতে চান যার মধ্যে অবজেক্ট ফু অন্তর্ভুক্ত রয়েছে, ফু ক্লাসকে তুলনামূলক ইন্টারফেস প্রয়োগ করতে হবে, কারণ তালিকার ক্রম মেথোড এই মেথোডটি ব্যবহার করছে।

আপনি যখন একটি অন্যান্য ক্লাসের তুলনা করে একটি ইউটিলি ক্লাস লিখতে চান তখন আপনি তুলনামূলক শ্রেণি প্রয়োগ করতে পারেন।


0

কর্মচারীর সারণীর
নাম, ডিওবি, বেতন
টমাস, 2/10/1982, 300
ড্যানিয়েল, 3/11/1990, 400
কোয়েম, 2/10/1998, 520

তুলনীয় উদাহরণস্বরূপ, যদি আপনি বা নাম অনুযায়ী সাজাও পারা সঙ্গে বেতন দ্বারা - ইন্টারফেস আপনাকে এক প্রাথমিক ক্ষেত্র রেফারেন্স সহ বস্তু যেমন এমপ্লয়িজ একটি তালিকা বাছাই করতে পারবেন CompareTo () পদ্ধতি

emp1.getName().compareTo(emp2.getName())

এই ধরনের প্রয়োজনীয়তার জন্য আরও নমনীয় ইন্টারফেসটি তুলনাকারী ইন্টারফেস দ্বারা সরবরাহ করা হয় , যার একমাত্র পদ্ধতিটি তুলনা করা হয় ()

public interface Comparator<Employee> {
 int compare(Employee obj1, Employee obj2);
}

কোডের উদাহরণ

public class NameComparator implements Comparator<Employee> {

public int compare(Employee e1, Employee e2) {
     // some conditions here
        return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an 
    return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}

}


0

আরও একটি বিষয়:

  • compareTo()থেকে Comparableইন্টারফেস এবং compare()থেকে Comparatorইন্টারফেস।
  • Comparableক্লাসের মধ্যে অবজেক্টের জন্য ডিফল্ট অর্ডারিং সংজ্ঞায়িত করতে ব্যবহৃত হয় যখন Comparatorকোনও পদ্ধতিতে পাস করার জন্য একটি কাস্টম অর্ডারিং সংজ্ঞায়িত করতে ব্যবহৃত হয়।

0

একটি প্রযুক্তিগত দিকও রয়েছে যা জোর দেওয়া উচিত। আপনি একটি ক্লায়েন্ট ক্লাস থেকে তুলনা আচরণ একখান প্রয়োজন, এবং আপনি হতাশ হয় কিনা ব্যবহার করতে বলুন Comparableবা Comparatorভালো একটি পদ্ধতি জন্য:

class Pokemon {
    int healthPoints;
    int attackDamage;
    public void battle (Comparable<Pokemon> comparable, Pokemon opponent) {
        if (comparable.compareTo(opponent) > 0) { //comparable needs to, but cannot, access this.healthPoints for example
            System.out.println("battle won");
        } else {
            System.out.println("battle lost");
        }
    }
}

comparableএকটি ল্যাম্বডা বা একটি বস্তু হবে এবং পোকেমন comparableক্ষেত্রগুলি অ্যাক্সেস করার কোনও উপায় নেই this। (একটি ল্যাম্বডায়, লাম্বদার স্কোপটিতে thisবহিরাগত শ্রেণীর উদাহরণকে বোঝায়, যেমন প্রোগ্রামের পাঠ্য অনুসারে সংজ্ঞায়িত করা হয়েছে)) সুতরাং এটি উড়বে না এবং আমাদের Comparatorদুটি যুক্তি সহ একটি ব্যবহার করতে হবে ।


0

বয়স, নাম, ডিপ্ট_নামের মতো একাধিক মানের ভিত্তিতে বাছাইয়ের জন্য তুলনামূলক ইন্টারফেস ব্যবহার করুন ... একটি মান ব্যবহারের জন্য তুলনামূলক ইন্টারফেস


-2
Important Answar
String name;
int roll;

public int compare(Object obj1,Object obj2) { // For Comparator interface
    return obj1.compareTo(obj1);
}

public int compareTo(Object obj1) { // For Comparable Interface
    return obj1.compareTo(obj);
}

এখানে return obj1.compareTo(obj1)বা return obj1.compareTo(obj)বিবৃতিতে কেবল অবজেক্ট গ্রহণ করুন; আদিম অনুমতি দেওয়া হয় না। উদাহরণ স্বরূপ

name.compareTo(obj1.getName()) // Correct Statement.

কিন্তু

roll.compareTo(obj1.getRoll()) 
// Wrong Statement Compile Time Error Because roll 
// is not an Object Type, it is primitive type.

নাম স্ট্রিং অবজেক্ট তাই এটি কাজ করে। আপনি যদি নীচের কোডটি ব্যবহারের চেয়ে শিক্ষার্থীর রোল নম্বর বাছাই করতে চান।

public int compareTo(Object obj1) { // For Comparable Interface
    Student s = (Student) obj1;
    return rollno - s.getRollno();
}  

অথবা

public int compare(Object obj1,Object obj2) { // For Comparator interface
    Student s1 = (Student) obj1;
    Student s2 = (Student) obj2;
    return s1.getRollno() - s2.getRollno();
}  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.