একটি জাভা শ্রেণীর তুলনামূলক কার্যকর করা উচিত কেন?


136

জাভা কেন Comparableব্যবহার করা হয়? কেন কেউ Comparableক্লাসে বাস্তবায়ন করবে ? বাস্তবের তুলনামূলক বাস্তবায়ন করতে গেলে আপনার বাস্তব উদাহরণটি কী?



এখানে একটি ভাল উদাহরণ রয়েছে: java67.blogspot.com/2012/10/…
james.garriss

উত্তর:


212

এখানে একটি বাস্তব জীবনের নমুনা। নোট যে 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);
}

15
আমি কেবল এটি লক্ষ করতে চাই যে প্রায়শই আপনি আপনার পদ্ধতির সাথে সামঞ্জস্য রাখতে আপনি ওভাররাইড করতে চান equals(এবং তাই hashCode) compareTo। উদাহরণস্বরূপ, এটি প্রয়োজনীয় যদি আপনি ক্লাসটি একটি সহ সুন্দর খেলতে চান TreeSet
পিজ

কেন কেবল ফিরবেন না last?
অনির্বাণ নাগ 'tintinmj'

@ অনির্বাণনাগিন্টিনটমজ 'শেষের নামটি একই রকম হলে ক্ষেত্রে প্রথম নাম অনুসারে স্বয়ংক্রিয়ভাবে বাছাই করতে।
অডডেভ

তুলনা কেন একটি ইনট রিটার্ন দেয় এবং এর অর্থ কী তা বোঝানোর জন্য এটি একটি ভাল প্লাস। সবচেয়ে সহায়ক.
james.garriss

1
@ ইউজার 393232000: ঠিক আছে, এটি সমস্ত ইন্টারফেসের মূল বিষয়। তবে নোট করুন যে "অন্যান্য জাভা পদ্ধতিতে" ব্যবহারকারীর দ্বারা রচিত পদ্ধতিগুলি অন্তর্ভুক্ত রয়েছে! আসলে আমি দাবি করতাম যে বেশিরভাগ ইন্টারফেস ব্যবহারকারীর কোড ব্যবহার করে। বৃহত্তর কোড বেসগুলিতে, "নিজেকে" দ্রুত "অন্য" হয়ে যায়
বেসগুলিতে

40

তুলনীয় একটি প্রাকৃতিক ক্রম সংজ্ঞায়িত করে। এর অর্থ হ'ল আপনি যখন এটির সংজ্ঞা দিচ্ছেন তখন যখন কোনও বস্তুকে "কম" বা "এর চেয়ে বড়" হিসাবে বিবেচনা করা উচিত।

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

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>কেবল তখনই কাজ করবে, যদি জেলা তুলনামূলক বাস্তবায়িত হয়, তাই না? এখনও এটি বোঝার চেষ্টা করছি
ফিলি 294

14

জাভাডোক থেকে উদ্ধৃত;

এই ইন্টারফেসটি প্রতিটি শ্রেণীর বস্তুগুলিতে এটি প্রয়োগ করে মোট ক্রম চাপায়। এই ক্রমটিকে শ্রেণীর প্রাকৃতিক ক্রম হিসাবে চিহ্নিত করা হয় এবং শ্রেণীর তুলনা করার পদ্ধতিটিকে তার প্রাকৃতিক তুলনা পদ্ধতি হিসাবে উল্লেখ করা হয়।

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

সম্পাদনা: .. এবং গুরুত্বপূর্ণ বিট সাহসী করেছে।


4
আমি বলব যে আপনি সাহসী হওয়ার পরে বাক্যটি ঠিক তেমন গুরুত্বপূর্ণ (যদি না হয়) তবে তা গুরুত্বপূর্ণ।
মাইকেল বর্গওয়ার্ট

8

কোনও শ্রেণি প্রয়োগ করে এমন Comparableঅর্থ হ'ল আপনি সেই শ্রেণি থেকে দুটি বস্তু নিতে এবং তাদের তুলনা করতে পারেন। কিছু ক্লাস যেমন নির্দিষ্ট সংকলনের মতো (কোনও সংগ্রহের মধ্যে বাছাইয়ের ফাংশন) যা বস্তুগুলি তুলনীয় হওয়ার জন্য তাদের উপর নির্ভর করে রাখে (সাজানোর জন্য আপনাকে কোন জিনিসটি "বৃহত্তম" এবং আরও অনেক কিছু আছে তা জানতে হবে)।


8

উপরের বেশিরভাগ উদাহরণগুলি দেখায় যে কীভাবে তুলনাযোগ্য কার্যে বিদ্যমান তুলনামূলক অবজেক্টটি পুনরায় ব্যবহার করতে হয়। আপনি যদি একই শ্রেণীর দুটি বস্তুর তুলনা করতে চান তবে আপনি নিজের তুলনাটি প্রয়োগ করতে চান, একটি এয়ারলাইনটিকিট অবজেক্টটি বলুন যে আপনি দাম অনুসারে বাছাই করতে চান (কম প্রথমে র‌্যাঙ্কিং), তারপরে স্টপওভারের সংখ্যা (আবার কম) প্রথম স্থান), আপনি নিম্নলিখিত করতে হবে:

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;            
    }
}

6

একাধিক ক্ষেত্রের তুলনা বাস্তবায়নের একটি সহজ উপায় হল পেয়ারার তুলনাচাইনের সাথে - তবে আপনি বলতে পারেন

   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);
  }
}

3

উদাহরণস্বরূপ যখন আপনি একটি বাছাই করা সংগ্রহ বা মানচিত্র রাখতে চান


ফার্নান্দো বলতে যা বোঝায় তা হ'ল: আপনি যদি "জিনিস" সংরক্ষণ করেন যা একটি সাজানো ধারক শ্রেণিতে তুলনামূলক প্রয়োগ করে, বাছাই করা ধারক শ্রেণি স্বয়ংক্রিয়ভাবে সেই "জিনিস" অর্ডার করতে পারে।
আয়ান দুর্কান

2

তুলনীয় আপনার শ্রেণীর উদাহরণগুলির তুলনা করতে ব্যবহৃত হয়। উদাহরণস্বরূপ আমরা বিভিন্ন উপায়ে তুলনা করতে পারি যে কারণে উদাহরণস্বরূপ আমরা 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


2

আপনি যখন Comparableইন্টারফেসটি প্রয়োগ করেন , আপনাকে পদ্ধতিটি প্রয়োগ করতে হবে compareTo()। আপনার প্রয়োজন বস্তুর তুলনা করতে, ব্যবহার করার জন্য, উদাহরণস্বরূপ, ArrayListক্লাসের পদ্ধতি বাছাইকরণ । আপনার জিনিসগুলি বাছাই করতে সক্ষম হওয়ার জন্য আপনার সাথে তুলনা করার একটি উপায় প্রয়োজন। সুতরাং compareTo()আপনার ক্লাসে আপনার একটি কাস্টম পদ্ধতি প্রয়োজন যাতে আপনি এটি ArrayListবাছাই পদ্ধতি সহ ব্যবহার করতে পারেন । compareTo()পদ্ধতি আয় -1,0,1।

আমি সবেমাত্র জাভা হেড ২.০ তে একটি অনুচ্ছেদটি পড়েছি, আমি এখনও শিখছি।


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;
}

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