2016-05-16 8 views
-2

Aus dem folgenden Code vergleicht ich nicht zwei Dinge bin zu verstehen:CompareTo() und() Methoden des Komparator und vergleichbare

  1. Die CompareTo() und Compare() Methoden geben int, aber wie funktioniert das die Sortierung beeinflussen? Die Methode gibt this.name.compareTo(d.name) zurück. Was gibt es in this.name?

Bitte erläutern Sie ausführlich.

import java.util.*; 

class Dog implements Comparator<Dog>, Comparable<Dog>{ 
    private String name; 
    private int age; 
    Dog(){ 
    } 

    Dog(String n, int a){ 
     name = n; 
     age = a; 
    } 

    public String getDogName(){ 
     return name; 
    } 

    public int getDogAge(){ 
     return age; 
    } 

    // Overriding the compareTo method 
    public int compareTo(Dog d){ 
     return (this.name).compareTo(d.name); 
    } 

    // Overriding the compare method to sort the age 
    public int compare(Dog d, Dog d1){ 
     return d.age - d1.age; 
    } 
} 

public class Example{ 

    public static void main(String args[]){ 
     // Takes a list o Dog objects 
     List<Dog> list = new ArrayList<Dog>(); 

     list.add(new Dog("Shaggy",3)); 
     list.add(new Dog("Lacy",2)); 
     list.add(new Dog("Roger",10)); 
     list.add(new Dog("Tommy",4)); 
     list.add(new Dog("Tammy",1)); 
     Collections.sort(list);// Sorts the array list 

     for(Dog a: list)//printing the sorted list of names 
     System.out.print(a.getDogName() + ", "); 

     // Sorts the array list using comparator 
     Collections.sort(list, new Dog()); 
     System.out.println(" "); 
     for(Dog a: list)//printing the sorted list of ages 
     System.out.print(a.getDogName() +" : "+ 
     a.getDogAge() + ", "); 
    } 
} 
+3

Was auch immer Sie tun, es ist unsinnig. 'Hund' sollte' Comparator '' nicht _ implementieren; Sie sollten eine separate Klasse (wahrscheinlich anonym) haben, die 'Comparator ' implementiert. In der Zwischenzeit, was erwartest du 'this.name'? Es ist der Name dieses Hundes, verglichen mit einem anderen Hund. –

+0

Für "vergleichen", wenn das Alter des Hundes gleich ist, sind sie gleich. Andernfalls, wenn der erste Hund älter ist, gibt es eine positive Zahl zurück, zweiter Hund, negative Zahl. – Compass

+0

@lois Ich habe keine Entschuldigung – Sri

Antwort

0

Wie Sie wahrscheinlich erraten, zu vergleichen und compareTo verwendet werden, um zwei Objekte zu vergleichen.

Wie es

compare(a, b) arbeitet vergleicht a und b-Objekte. Wenn der zurückgegebene Wert < 0 ist, dann ist a niedriger als b. Wenn es 0 ist, sind beide Objekte gleich. Wenn es 0 überlegen ist, ist a größer als b.

a.compareTo(b) vergleicht auch Objekte a und b. Der Rückgabewert funktioniert genauso wie für compare. Beim Aufruf muss jedoch darauf geachtet werden, dass a nicht null ist, da sonst eine NullPointerException ausgelöst wird.

Wenn es

Wenn Ihre Klasse ein Vergleichsschema, verwenden müssen nur dann nur mit compareTo in Ordnung ist.

Wenn Sie jedoch Dog auf verschiedene Arten sortieren benötigen, beispielsweise zu einer Zeit Sie sie nach Alter und ein anderes Mal nach Namen sortiert werden soll, das ist, wo Comparator handlich wird. Sie können einfach zwei Comparator<Dog> erstellen, eine, die nach Alter und die andere nach Namen sortiert. Wenn Sie eine Methode wie sort aufrufen, geben Sie als Argument den Komparator an, den Sie verwenden möchten, um die gewünschte Sortierung zu erhalten.

Relative auf Ihre Frage

Das Schlüsselwort this bezieht sich auf die aktuelle Dog-Instanz. So ist this.name der Name der aktuellen Dog Instanz.

0

CompareTo() wird verwendet, um die 'natürliche Reihenfolge' der Objekte zu definieren, und erstellt ein int, um festzustellen, welches Objekt 'größer' ist als das andere und implementiert Comparable.

a.compareTo(b)<0 //same as a<b  
a.compareTo(b)>0 //same as a>b 
a.compareTo(b)==0 //same as a==b 
a.compareTo(b)!=0 //same as a!=b 
a.compareTo(b)<=0 //same as a<=b 
a.compareTo(b)>=0 //same as a>=b 

Was, wie es Art anders wird als Vergleich() ist ganz oben, wie Sie die compareTo() implementieren.

Heres ein Beispiel, wie unter der Annahme, phonenumber hat 3 Felder: areacode, Präfix, Zeilennummer:

public int compareTo(PhoneNumber pn){ 
       // Compare area codes 
      if (areaCode< pn.areaCode) { 
       return -1; 
      } 
      if (areaCode > pn.areaCode){ 
        return 1; 
      } 
      // Area codes are equal, compare prefixes 
      if (prefix < pn.prefix){ 
        return -1; 
      } 
      if (prefix > pn.prefix){ 
        return 1; 
      } 
      // Area codes and prefixes are equal, compare line numbers 
      if (lineNumber < pn.lineNumber){ 
        return -1; 
      } 
      if (lineNumber > pn.lineNumber){ 
        return 1; 
      } 
      return 0; // All fields are equal 
      } 

Während vergleichen() nimmt zwei Objekte und vergleicht die Werte zwischen den Feldern, und Der Komparator implementiert

compare(a,b)<0 //same as a<b  
compare(a,b)>0 //same as a>b 
compare(a,b)==0 //same as a==b 
compare(a,b)!=0 //same as a!=b 
compare(a,b)<=0 //same as a<=b 
compare(a,b)>=0 //same as a>=b 

this Antwort hat eine viel aufwendigere und articula die Erklärung zum Komparator und vergleichbar.

Verwandte Themen