তুলনীয় এবং তুলনামূলক কখন ব্যবহার করবেন


108

স্কোর বলার জন্য আমার প্রয়োজনীয় সামগ্রীর একটি তালিকা রয়েছে say খুব বেশি চিন্তা না করেই আমি একটি নতুন ক্লাস লিখেছিলাম যা তুলনামূলককে কার্যকর করে, এটি কাজটি করে এবং এটি কাজ করে।

এখন এটি পিছনে তাকিয়ে আমি ভাবছি যে আমার ক্লাসটি তুলনামূলক কার্যকরকারী একটি নতুন শ্রেণি তৈরির পরিবর্তে তুলনামূলক বাস্তবায়ন করা উচিত কিনা? স্কোর হ'ল একমাত্র ক্ষেত্র যা অবজেক্টগুলি অর্ডার করা হবে।

  1. আমি অনুশীলন হিসাবে গ্রহণযোগ্য কি করেছি?

  2. সঠিক পন্থাটি কি "প্রথম শ্রেণীর তুলনামূলক প্রয়োগ করা হবে (প্রাকৃতিক ক্রমবর্ধনের জন্য) এবং যদি বিকল্প ক্ষেত্রের তুলনা প্রয়োজন হয়, তবে নতুন শ্রেণি তৈরি করুন যা তুলনামূলককে কার্যকর করে"?

  3. যদি উপরের (2) সত্য হয়, তবে এর অর্থ কি এই যে ক্লাসটি তুলনামূলক প্রয়োগ করার পরে কেবল তার তুলনামূলক প্রয়োগ করা উচিত? (ধরে নিচ্ছি আমি মূল শ্রেণীর মালিক)

উত্তর:


80

আমি বলব যে কোনও বস্তুর তুলনামূলক বাস্তবায়ন করা উচিত যদি এটি ক্লাসটি বাছাই করার সুস্পষ্ট প্রাকৃতিক উপায় এবং ক্লাসটি বাছাই করার জন্য যে কেউ প্রয়োজন হয় সাধারণত সেভাবে এটি করতে চায়।

যদি, তবে, বাছাই করা ক্লাসের একটি অস্বাভাবিক ব্যবহার ছিল বা বাছাই করা নির্দিষ্ট ব্যবহারের ক্ষেত্রে কেবল বোঝায়, তবে তুলনাকারী আরও ভাল বিকল্প।

শ্রেণীর নাম দেওয়া অন্য একটি উপায় রাখুন, এটি কী পরিষ্কার হয় যে তুলনামূলক কীভাবে বাছাই করা যায়, বা আপনাকে জাভাদোক পড়তে অবলম্বন করতে হবে? যদি এটি পরে হয় তবে প্রতিক্রিয়াগুলি প্রতিটি ভবিষ্যতের বাছাইয়ের ক্ষেত্রে একটি তুলনাকারীর প্রয়োজন হয়, যার সাথে তুলনামূলক প্রয়োগটি শ্রেণীর ব্যবহারকারীদের গতি কমিয়ে দিতে পারে, তাদের গতি বাড়ায় না।


আপনি দয়া করে একটি দ্রুত উদাহরণ দিতে পারেন?
rgamber

এটি ভাল উদাহরণ হতে পারে: gist.github.com/yclian/2627608 সংস্করণ শ্রেণি রয়েছে যা তুলনামূলক ভার্সন ব্যবহার করে। সংস্করণ - ফ্যাক্টরি পদ্ধতিগুলির সাথে তুলনাযোগ্য সংস্করণ সরবরাহ করে যা বস্তু হিসাবে বিবেচিত হয় (কোনও স্থির পদ্ধতি ছাড়াই) - এমন একটি সংস্করণ সরবরাহ করে যা অন্য কোনওটির সাথে তুলনা করতে সক্ষম হয়। দায়িত্ব পৃথক করা হয়।
ses


সাক্ষাত্কারকারী জিজ্ঞাসা করেছিলেন, তুলনার সাথে যখন একই কাজ করা যায় তখন কেন তুলনামূলক ব্যবহার করা হবে, এবং আমি বোবা ছিলাম :(
আডাম

@aLearner লিঙ্কটি মারা গেছে
G.Brown

127

Comparableযদি আপনি প্রশ্নে অবজেক্টের একটি ডিফল্ট (প্রাকৃতিক) ক্রম আচরণকে সংজ্ঞায়িত করতে চান তবে ব্যবহার করুন , একটি সাধারণ অনুশীলন হ'ল এর জন্য অবজেক্টটির কোনও প্রযুক্তিগত বা প্রাকৃতিক (ডাটাবেস?) সনাক্তকারী ব্যবহার করা।

Comparatorআপনি যদি কোনও বাহ্যিক নিয়ন্ত্রণযোগ্য ক্রমবর্ধমান ক্রিয়াকলাপটি সংজ্ঞায়িত করতে চান তবে ব্যবহার করুন , এটি ডিফল্ট ক্রম আচরণকে ওভাররাইড করতে পারে।


3
এটি একটি প্রযুক্তিগত ব্যাখ্যা, এবং তারা আসার মতো সঠিক, তবে এটি সর্বোত্তম অনুশীলন সম্পর্কে সত্যই কিছু বলে না।
এক্সেরেনন

40
এটি কখন ব্যবহার করতে হবে তা বলছে - যদি এটি সর্বোত্তম অনুশীলন না হয় তবে এটি কী?
বোঝো

1
"বাস্তবায়ন Comparableমানে কি আমি প্রাকৃতিক ক্রম সংজ্ঞায়িত করছি?" , এটি আমাকে উত্তর দিয়েছে যা আমি খুঁজছিলাম। ধন্যবাদ :)
সোমজিৎ

61

ব্যবহার Comparable:

  • যদি বিষয়টি আপনার নিয়ন্ত্রণে থাকে।
  • তুলনা আচরণ যদি প্রধান তুলনা আচরণ হয়।

ব্যবহার Comparator:

  • যদি বিষয়টি আপনার নিয়ন্ত্রণের বাইরে থাকে এবং আপনি এগুলি কার্যকর করতে না পারেন Comparable
  • আপনি যখন আচরণের তুলনা করতে চান তখন ডিফল্ট (যা দ্বারা নির্দিষ্ট করা হয় Comparable) এর আচরণের চেয়ে আলাদা হয় ।

20

তুলনীয় -java.lang.Comparable: int compareTo(Object o1)

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

  • প্রদত্ত বস্তুর সাথে বর্তমান বস্তুর তুলনা করতে সক্ষম।
  • এটি ব্যবহার করে আমরা only one sort sequenceউদাহরণগুলির বৈশিষ্ট্যের ভিত্তিতে প্রয়োগ করতে পারি । গো EX:Person.id
  • স্ট্রিং, র্যাপার ক্লাস, তারিখ, ক্যালেন্ডার এর মতো কিছু পূর্বনির্ধারিত শ্রেণি তুলনামূলক ইন্টারফেস প্রয়োগ করেছে।

তুলক -java.util.Comparator: int compare(Object o1, Object o2)

একটি তুলনামূলক বস্তু দুটি পৃথক বস্তুর তুলনা করতে সক্ষম। শ্রেণিটি তার দৃষ্টান্তগুলির তুলনা করে না, তবে কিছু অন্যান্য শ্রেণির উদাহরণগুলির তুলনা করে। এই তুলনামূলক শ্রেণীর অবশ্যই java.util.Comparator ইন্টারফেস প্রয়োগ করতে হবে।

  • একই ধরণের যে কোনও দুটি বস্তুর তুলনা করতে সক্ষম।
  • এটি ব্যবহার করে আমরা প্রতিটিগুলির প্রয়োগ many sort sequenceও নামকরণ করতে পারি , উদাহরণগুলির বৈশিষ্ট্যের উপর ভিত্তি করে। গো EX:Person.id, Person.name, Person.age
  • আমরা কাস্টমাইজড বাছাইয়ের জন্য আমাদের পূর্বনির্ধারিত শ্রেণিতে তুলনামূলক ইন্টারফেস প্রয়োগ করতে পারি।

উদাহরণ:

public class Employee implements Comparable<Employee> {

    private int id;
    private String name;
    private int age;
    private long salary;

    // Many sort sequences can be created with different names.
    public static Comparator<Employee> NameComparator = new Comparator<Employee>() {         
        @Override
        public int compare(Employee e1, Employee e2) {
            return e1.getName().compareTo(e2.getName());
        }
    };
    public static Comparator<Employee> idComparator = new Comparator<Employee>() {       
        @Override
        public int compare(Employee e1, Employee e2) {
            return Integer.valueOf(e1.getId()).compareTo(Integer.valueOf(e2.getId()));
        }
    };

    public Employee() { }
    public Employee(int id, String name, int age, long salary){
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    // setters and getters.

    // Only one sort sequence can be created with in the class.
    @Override
    public int compareTo(Employee e) {
    //return Integer.valueOf(this.id).compareTo(Integer.valueOf(e.id));
    //return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
        if (this.id > e.id) {
            return 1;
        }else if(this.id < e.id){
            return -1;
        }else {
            return Character.toString(this.name.charAt(0)).compareToIgnoreCase(Character.toString(e.name.charAt(0)));
        }

    }   

    public static void main(String[] args) {

        Employee e1 = new Employee(5, "Yash", 22, 1000);
        Employee e2 = new Employee(8, "Tharun", 24, 25000);

        List<Employee> list = new ArrayList<Employee>();
        list.add(e1);
        list.add(e2);
        Collections.sort(list); // call @compareTo(o1)
        Collections.sort(list, Employee.nameComparator); // call @compare (o1,o2)
        Collections.sort(list, Employee.idComparator); // call @compare (o1,o2)
    }
}
  • কাস্টমাইজড বাছাইয়ের জন্য আমরা তুলনামূলক @compare (o1, o2) তুলনায় অন্য পরিস্থিতিতে আমরা তুলনীয় @compareTo (o1) এর জন্য যাই, যদি পরিবর্তিত কোডের সাথে আমরা একাধিক ক্ষেত্রকে বাছাই করতে চাই তবে আমরা তুলনামূলক ব্যবহার করি।

জন্য জাভা 8 ল্যামডা: comparator আমার পোস্টে পড়ুন।


10

আপনি যখন একই শ্রেণীর উদাহরণগুলির সাথে তুলনা করেন তখন তুলনীয় ব্যবহার করা উচিত।

তুলনাকারী বিভিন্ন শ্রেণীর উদাহরণগুলির তুলনা করতে ব্যবহার করা যেতে পারে।

তুলনীয় শ্রেণীর দ্বারা প্রয়োগ করা হয় যা এর সামগ্রগুলির জন্য প্রাকৃতিক ক্রম সংজ্ঞায়িত করা প্রয়োজন। স্ট্রিং যেমন তুলনামূলক প্রয়োগ করে।

যদি কেউ আলাদা আলাদা বাছাইয়ের আদেশ চায় তবে সে তুলনাকারী বাস্তবায়ন করতে পারে এবং দুটি উদাহরণের তুলনার নিজস্ব পদ্ধতিটি নির্ধারণ করতে পারে।


10

যদি বস্তুর বাছাই প্রাকৃতিক অর্ডারের উপর ভিত্তি করে করা হয় তবে তুলনামূলক ব্যবহার করুন যখন আপনার বাছাই করা বিভিন্ন বস্তুর বৈশিষ্ট্যের উপর করা দরকার হয়, তবে জাভাতে তুলনামূলক ব্যবহার করুন।

তুলনীয় এবং তুলনাকারীর মধ্যে প্রধান পার্থক্য:

+------------------------------------------------------------------------------------+
¦               Comparable                ¦                Comparator                ¦
¦-----------------------------------------+------------------------------------------¦
¦ java.lang.Comparable                    ¦ java.util.Comparator                     ¦
¦-----------------------------------------+------------------------------------------¦
¦ int objOne.compareTo(objTwo)            ¦ int compare(objOne, objTwo)              ¦
¦-----------------------------------------+------------------------------------------¦
¦ Negative, if objOne < objTwo            ¦ Same as Comparable                       ¦
¦ Zero,  if objOne == objTwo              ¦                                          ¦
¦ Positive,  if objOne > objTwo           ¦                                          ¦
¦-----------------------------------------+------------------------------------------¦
¦ You must modify the class whose         ¦ You build a class separate from to sort. ¦
¦ instances you want to sort.             ¦ the class whose instances you want       ¦
¦-----------------------------------------+------------------------------------------¦
¦ Only one sort sequence can be created   ¦ Many sort sequences can be created       ¦
¦-----------------------------------------+------------------------------------------¦
¦ Implemented frequently in the API by:   ¦ Meant to be implemented to sort          ¦
¦ String, Wrapper classes, Date, Calendar ¦ instances of third-party classes.        ¦
+------------------------------------------------------------------------------------+

9

তুলনাকারী তুলনামূলক যা কিছু করে তা আরও অনেক কিছু করে।

| | Comparable | Comparator ._______________________________________________________________________________ Is used to allow Collections.sort to work | yes | yes Can compare multiple fields | yes | yes Lives inside the class you’re comparing and serves | | as a “default” way to compare | yes | yes Can live outside the class you’re comparing | no | yes Can have multiple instances with different method names | no | yes Input arguments can be a list of | just Object| Any type Can use enums | no | yes

আমি তুলনাকারীদের বেনাম শ্রেণি হিসাবে নিম্নরূপে ব্যবহার করার সর্বোত্তম পন্থা পেয়েছি:

private static void sortAccountsByPriority(List<AccountRecord> accounts) {
    Collections.sort(accounts, new Comparator<AccountRecord>() {

        @Override
        public int compare(AccountRecord a1, AccountRecord a2) {
            return a1.getRank().compareTo(a2.getRank());
        }
    });
}

আপনি যে শ্রেণীরটি বাছাই করার পরিকল্পনা করছেন তার মধ্যেই আপনি এই জাতীয় পদ্ধতির একাধিক সংস্করণ তৈরি করতে পারেন। সুতরাং আপনি থাকতে পারেন:

  • sortAccountsByPriority
  • sortAccountsByType
  • sortAccountsByPriorityAndType

    ইত্যাদি ...

এখন, আপনি এই সাজানোর পদ্ধতিগুলি যে কোনও জায়গায় ব্যবহার করতে পারেন এবং কোড পুনরায় ব্যবহার করতে পারেন। এটি আমাকে তুলনামূলক সব কিছু দেয়, আরও বেশি ... তাই আমি তুলনামূলক ব্যবহার করার কোনও কারণ দেখতে পাচ্ছি না।


8

আমি বলব:

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

6

নিম্নলিখিত পয়েন্টগুলি আপনাকে কোন পরিস্থিতিতে তুলনীয় এবং কোনটি তুলনামূলক ব্যবহার করা উচিত তা সিদ্ধান্ত নিতে সহায়তা করে:

1) কোড অ্যাভাইল্যাবলিটি

2) একাধিক বাছাইয়ের মানদণ্ড একক ভার্সেস

3) অ্যারে.সোর্ট () এবং সংগ্রহ.সোর্ট ()

4) সোর্টার্ড ম্যাপ এবং সোর্টসেটে কী হিসাবে

5) ক্লাস সংখ্যা ভার্সেস নমনীয়তা

6) ইন্টারক্লাস তুলনা

7) প্রাকৃতিক আদেশ

আরও বিশদ নিবন্ধের জন্য আপনি তুলনীয় কখন এবং কখন তুলনামূলক ব্যবহার করবেন তা উল্লেখ করতে পারেন


আমি ভাবছি কেন কেউ এই উত্তরটিকে সমর্থন করে না। এটা সত্যিই খুব সুন্দর। +1
দিগন্ত

4
  • ক্লাসটি লেখার মুহুর্তে যদি আপনার তুলনাযোগ্য বাছাইয়ের ক্ষেত্রে কেবলমাত্র একটি ব্যবহারের ক্ষেত্রে থাকে।
  • কেবলমাত্র যখন আপনার তুলনা করার জন্য বাছাইয়ের একাধিক কৌশল থাকে।

4

আপনার যদি প্রাকৃতিক অর্ডার বাছাই করতে হয় - ব্যবহারকারী তুলনামূলক যদি আপনার কাস্টম অর্ডার বাছাই করা প্রয়োজন - তুলনামূলক ব্যবহার করুন

উদাহরণ:

Class Employee{
private int id;
private String name;
private String department;
}

প্রাকৃতিক অর্ডার বাছাই আইডির উপর ভিত্তি করে হবে কারণ এটি অনন্য এবং কাস্টম অর্ডার সাজানোর জি নাম এবং বিভাগ হবে।

রেফারেন্স:
কখন কোনও শ্রেণি তুলনীয় এবং / বা তুলনামূলক হওয়া উচিত? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html


3

এখানে একটি অনুরূপ প্রশ্ন ছিল: একটি ক্লাস কখন তুলনীয় এবং / বা তুলনামূলক হওয়া উচিত?

আমি নিম্নলিখিতটি বলব: প্রাকৃতিক অর্ডারের মতো কোনও কিছুর জন্য তুলনীয় প্রয়োগ করুন, যেমন অভ্যন্তরীণ আইডির ভিত্তিতে

আপনার তুলনায় আরও জটিল তুলনামূলক অ্যালগরিদম থাকে, যেমন একাধিক ক্ষেত্র এবং আরও যদি একটি তুলনাকারী প্রয়োগ করুন।


1
একাধিক ক্ষেত্রের উপর অর্ডার করা ভাল হিসাবে সম্পন্ন করা যেতে পারে Comparable
বালুসসি

তুলনীয় এবং তুলনাকারীর মধ্যে পার্থক্যের জন্য আপনি java-jorter.blogspot.in/2010/12/…
একজন শিক্ষার্থী

2

তুলনীয়:
যখনই আমরা কেবল একজাতীয় উপাদান এবং ডিফল্ট প্রাকৃতিক বাছাইয়ের প্রয়োজনীয় অর্ডার সঞ্চয় করতে চাই, আমরা শ্রেণি প্রয়োগের জন্য যেতে পারি comparable ইন্টারফেসের ।

তুলনাকারী:
যখনই আমরা একজাতীয় এবং ভিন্ন ভিন্ন উপাদানগুলি সংরক্ষণ করতে চাই এবং আমরা ডিফল্ট কাস্টমাইজড বাছাইয়ের ক্রমটি বাছাই করতে চাই, আমরা comparatorইন্টারফেসের জন্য যেতে পারি ।


0

আমার প্রয়োজন তারিখের উপর ভিত্তি করে সাজানো ছিল।

সুতরাং, আমি তুলনামূলক ব্যবহার করেছি এবং এটি আমার পক্ষে সহজেই কাজ করেছিল।

public int compareTo(GoogleCalendarBean o) {
    // TODO Auto-generated method stub
    return eventdate.compareTo(o.getEventdate());
}

তুলনীয়ের সাথে একটি সীমাবদ্ধতা হ'ল তারা তালিকা ব্যতীত সংগ্রহের জন্য ব্যবহার করতে পারবেন না।


0

আপনি যদি ক্লাসের মালিক হন তবে তুলনার সাথে আরও ভাল যান । সাধারণত comparator আপনি আত বর্গ মালিক ব্যবহৃত হয় কিন্তু আপনি এটি একটি ব্যবহার করতে হবে TreeSet বা TreeMap কারণ comparator TreeSet বা TreeMap এর conctructor একটি প্যারামিটার হিসাবে প্রেরণ করা সম্ভব। আপনি কীভাবে তুলনামূলক এবং তুলনীয় ব্যবহার করতে পারেন তা http://preciselyconcise.com/java/col લેક્ // g_comparator.php এ দেখতে পারেন


0

আমাকে একটি সাক্ষাত্কারের মধ্যে nlgn সময়ের চেয়ে ভাল সংখ্যার একটি নির্দিষ্ট পরিসীমা বাছাই করতে বলা হয়েছে। (গণনা বাছাই ব্যবহার না করা)

কোনও সামগ্রীর উপর তুলনামূলক ইন্টারফেস প্রয়োগ করা অন্তর্নিহিত বাছাই করা অ্যালগোসকে ওভাররাইড করা তুলনা পদ্ধতি ব্যবহার করতে মঞ্জুরি দেয় উপাদানগুলি সাজানোর জন্য এবং এটি লিনিয়ার সময় হতে পারে।


0

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

Treeset t=new Treeset();
t.add(2);
t.add(1);
System.out.println(t);//[1,2]

তুলনাকারী হ'ল কাস্টম মাইকম্পেরেটর ক্লাসে প্রয়োগ করা কাস্টম বাছাইয়ের আদেশটি উদাহরণের জন্য তুলনামূলক পদ্ধতিটিকে ওভাররাইড করে:

Treeset t=new Treeset(new myComparator());
t.add(55);
t.add(56);
class myComparator implements Comparator{
public int compare(Object o1,Object o2){
//Descending Logic
}
}
System.out.println(t);//[56,55]

-1

খুব সহজ পদ্ধতির ধারণা করা হয় যে প্রশ্নে থাকা সত্তা শ্রেণিটি ডাটাবেসে এবং তারপরে ডাটাবেস টেবিলের মধ্যে আপনাকে সত্তা শ্রেণীর ক্ষেত্রগুলি দিয়ে তৈরি সূচির প্রয়োজন হবে? যদি উত্তর হ্যাঁ হয় তবে তুলনামূলক বাস্তবায়ন করুন এবং প্রাকৃতিক বাছাইয়ের জন্য সূচী ক্ষেত্রটি ব্যবহার করুন। অন্যান্য সমস্ত ক্ষেত্রে তুলনামূলক ব্যবহার করুন।


-2

বাস্তবায়নের জন্য আমার টিকা লিবিব Comparableএবং Comparator:

public class Person implements Comparable<Person> {         
    private String firstName;  
    private String lastName;         
    private int age;         
    private char gentle;         

    @Override         
    @CompaProperties({ @CompaProperty(property = "lastName"),              
        @CompaProperty(property = "age",  order = Order.DSC) })           
    public int compareTo(Person person) {                 
        return Compamatic.doComparasion(this, person);         
    }  
}

আরও উদাহরণ দেখতে লিঙ্কে ক্লিক করুন। http://code.google.com/p/compamatic/wiki/CompamaticByExamples

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.