Java >> Java tutorial >  >> Java

Forskellen mellem sammenlignelig og komparator

I Java kan du skrive dine egne programmer, hvis du vil sortere en liste over elementer. Du har muligvis en samlingsklasse som ArrayList eller HashSet. I dette tilfælde, hvis du vil sortere de objekter, der er gemt i klasserne, kan det være svært ved at skrive komplekse programmer.

For at hjælpe dig med at sortere elementerne i en samling tilbyder Java to grænseflader. De er sammenlignelige og komparatorer. Den sammenlignelige grænseflade vil give dig en enkelt teknik til at sortere elementerne. På den anden side tilbyder Comparator-grænsefladen dig forskellige måder at sortere elementer på.

I denne artikel vil vi diskutere applikationerne og forskellene mellem de to grænseflader.

Hvad er sammenligneligt i Java?

Før du sorterer nogle elementer, skal de sammenlignes individuelt. Så for at en klasse kan sammenligne sine datamedlemmer, skal den implementere java.lang.Comparable-grænsefladen. Det sammenlignelige objekt er i stand til at sammenligne et andet objekt med sig selv.

Den sammenlignelige grænseflade bruges almindeligvis til at sortere rækkefølgen af ​​elementer i klasser defineret af brugeren. Du kan bruge denne grænseflade til at sortere følgende objekter:

  • Objekter fra en Wrapper-klasse
  • Stringobjekter
  • Objekter af en brugerdefineret klasse

Som standard implementerer klassen String og Wrapper den sammenlignelige grænseflade. Derfor, hvis du gemmer et String- eller Wrapper-klasseobjekt i et sæt, kort eller en liste, vil de være sammenlignelige.

For eksempel har vi en klasse, der indeholder information om bøger. Datamedlemmerne er navn, forfatter, udgivelsesår og rating. Til dette har den sammenlignelige grænseflade en metode kaldet compareTo(T obj). Dette vil blive brugt af sorteringsmetoder for at få det ønskede resultat.

I dette tilfælde skal du tilsidesætte compareTo()-metoden på en måde, så den returnerer:

  • Negativt heltal, hvis det ene objekt er mindre end det andet
  • Positivt heltal, hvis det ene objekt er større end det andet
  • Nul, hvis de er ens

Men når du gør et element i en samling sammenligneligt, får du kun én mulighed for at implementere compareTo()-metoden. Så du kan sortere elementerne efter et enkelt kriterium, såsom forfatter til bogen.

Eksempel:

//Java Program Example for Comparable

import java.io.*;
import java.util.*;

class Customer implements Comparable<Customer>{

  //Variable Declaration
  private String name;
  private int age;
  private int bill;

  //Function to compare values start

  public int compareTo(Customer m){
    return this.age - m.age;
  }
  //function ends

  //Customer Constructor

  public Customer (String nm, int ag, int bl)
  {
    this.name = nm;
    this.age = ag;
    this.bill = bl;
  }

  public String getName() { return name; } //Returns the name of customer
  public int getAge() { return age; } //Returns the age of customer
  public int getBill() {return bill; } //Returns the bill of customer

}

// Main / Driver Class of program
class Main
{
  public static void main (String[] args) {
    //object declartion for list
    ArrayList<Customer> list = new ArrayList<Customer>();

    //Adding Values to the list
    list.add(new Customer("Customer 1",39, 49));
    list.add(new Customer("Customer 2",14, 275));
    list.add(new Customer("Customer 3",75, 12));
    list.add(new Customer("Customer 4",25, 99));
    list.add(new Customer("Customer 5",23, 5));

    //Here it will call the CompareTo function
    Collections.sort(list);

    System.out.println("Customers after sorting on Age : ");

    for(Customer Customer: list)
    {
      System.out.println(Customer.getName() + " " +
                            Customer.getAge() + " " +
                            Customer.getBill());
    }
  }
}


OUTPUT:

Customers after sorting on Age :
Customer 2 14 275
Customer 5 23 5
Customer 4 25 99
Customer 1 39 49
Customer 3 75 12

Hvad er Comparator i Java?

Objekterne inden for en brugerdefineret klasse kan sorteres ved hjælp af Comparator-grænsefladen. Det vigtigste mellem denne grænseflade og Comparable er, at Comparator giver dig funktionaliteten til at sammenligne flere datamedlemmer.

Java.util-pakken indeholder Comparator-grænsefladen. Komparatoren har to metoder:

  • public int compare (Object obj1, Object obj2) – Den sammenligner det første og det andet objekt, der sendes ind i det
  • offentlig boolesk lig (Objektelement) – Denne metode sammenligner det aktuelle objekt med det andet objekt, der er angivet i metoden

Når du bruger sammenligningsmetoden, bør den returnere følgende:

  • Du får et negativt heltal tilbage, hvis det andet argument er større end det første argument
  • Et positivt heltal, hvis det første argument, der sendes, er større end det andet argument
  • Hvis begge argumenter er ens, får du et nul

I tilfælde af lighedsmetoden kontrolleres, om den påkaldende komparator og objekt er ens. Her bruges obj-argumentet til at teste lighed. Hvis både obj-argumentet og de påkaldende objekter er komparatorobjekter, vil metoden returnere sand. Rækkefølgen af ​​objekterne skal være den samme. Ellers vil metoden returnere en falsk værdi.

Du kan bruge Comparator-grænsefladen i følgende tilfælde:

  • Til sortering af en liste over objekter eller et array ved hjælp af en tilpasset rækkefølge
  • Du kan sortere den samme liste over objekter eller array på forskellige felter
  • Til sortering af en liste over objekter eller et array, hvis kildekode ikke kan ændres for at implementere den sammenlignelige grænseflade
  • Sammenligningsgrænsefladen er nyttig, mens du bruger en gruppe ved at sortere en liste over objekter eller en matrix for forskellige felter

Klassen Samlinger har en sorteringsmetode til at organisere elementer af en komparatortype og en liste. Du kan sortere listeelementerne med Comparator type efter Collections.sort(List, Comparator).

Eksempel:

//Java program for Comparator

import java.io.*;
import java.util.*;

// Class 'Customer' implements Comparable

class Customer implements Comparable<Customer>{

  //Variable Declaration

  private String name;
  private int age;
  private int bill;

  //Function to compare values start

  public int compareTo(Customer m){
    return this.age - m.age;
  }

  //function ends

  //Customer Constructor

  public Customer (String nm, int ag, int bl)
  {
    this.name = nm;
    this.age = ag;
    this.bill = bl;
  }

  public String getName() { return name; }  //Returns the name of customer
  public int getAge() { return age; }  //Returns the age of customer
  public int getBill() {return bill; }  //Returns the bill of customer

}

//This class used to get sorting on Name
class NameCompare implements Comparator<Customer>
{
    public int compare(Customer c1, Customer c2)
    {
        return c1.getName().compareTo(c2.getName());
    }
}

//Main / Driver Class of program

class Main
{
  public static void main (String[] args) {

    //object declartion for list

    ArrayList<Customer> list = new ArrayList<Customer>();

    //Adding Values to the list

    list.add(new Customer("Customer 1",39, 49));
    list.add(new Customer("Customer 2",14, 275));
    list.add(new Customer("Customer 3",75, 12));
    list.add(new Customer("Customer 4",25, 99));
    list.add(new Customer("Customer 5",23, 5));

    //Here it will call the CompareTo function

    Collections.sort(list);

    //Sorting on Age

    System.out.println("Customers after sorting on Age : ");

    for(Customer Customer: list)
    {
      System.out.println(Customer.getName() + " " +
                            Customer.getAge() + " " +
                            Customer.getBill());
    }

    //Sorting on Name

    System.out.println("\nCustomer Sorted by name : ");
        NameCompare nameCompare = new NameCompare();
        Collections.sort(list, nameCompare);
        for (Customer Customer: list)
            System.out.println(Customer.getName() + " " +
                            Customer.getAge() + " " +
                            Customer.getBill());
  }
}

OUTPUT:

Customers after sorting on Age :
Customer 2 14 275
Customer 5 23 5
Customer 4 25 99
Customer 1 39 49
Customer 3 75 12

Customer Sorted by name :
Customer 1 39 49
Customer 2 14 275
Customer 3 75 12
Customer 4 25 99
Customer 5 23 5 

Sammenlignende vs sammenlignelig

Sammenligningsgrundlag

Sammenlignelig

Komparator

Antal sorteringsteknikker

Det giver dig en enkelt sorteringsteknik. For eksempel er du i stand til at sortere elementerne baseret på enkelt egenskab som ID eller navn.

Denne grænseflade giver dig flere teknikker til at sortere elementer.

Bestilling

Det er nyttigt for objekter, der har en naturlig rækkefølge. For eksempel serienummer på medarbejdere.

Det er nyttigt for objekter, der måske ikke har en naturlig rækkefølge.

Pakke

Interfacet er til stede i java.lang-pakken

Dette er til stede i java.util-pakken

Metoder

Denne grænseflade har den offentlige int compareTo() til sortering af elementer

Denne grænseflade har den offentlige int compare() og boolean equals()-metoden

Sammenligningsprocedure

I compareTo(Object obj) sammenlignes objektet, der kalder metoden, med objektet, der sendes i metoden

Her, i compare(Object obj1, Object obj2)-metoden, sammenlignes begge objekter, der videregives til denne metode

Effekt på den oprindelige klasse

Her påvirkes den oprindelige klasse, og den ændres. Dette skyldes, at grænsefladen er implementeret af den klasse, hvis objekter du vil sammenligne

Denne grænseflade ændrer ikke den originale klasse. Her er grænsefladen implementeret af en separat klasse i stedet for den originale.

Listeelementer

Samling-klassen giver dig en Collections.sort(List) til at sammenligne listeelementer af sammenlignelig type

Collection-klassen giver dig Collections.sort(List, Comparator) til at sortere listeelementer, der har Comparator-typen

Konklusion

Grænsefladerne Comparable og Comparator har lidt forskellige applikationer. Du skal bruge dem baseret på dine krav. Den sammenlignelige grænseflade bruges, når du ønsker at sortere en samling af elementer baseret på et enkelt element. På den anden side kan du bruge Comparator-grænsefladen til at sortere elementer baseret på mere end ét kriterium.

Til Comparable-metoden bruger Collection.sort() og Arrays.sort() metoden compareTo(). Men i tilfælde af Comparator-grænsefladen, kan du bruge compare()-metoden ved at levere Comparator-klassen.

Hvis du vil sortere elementerne ud fra deres naturlige sorteringsrækkefølge, skal du bruge Comparable. For at sortere elementer i henhold til en brugerdefineret sorteringsrækkefølge, brug komparatoren.


Java tag