2016-05-16 12 views
-2

の()メソッドを比較し、私は二つのことを理解していないです:のCompareTo()と下記のコードからコンパレータと同等の

  1. CompareTo()Compare()方法はintを返しますが、どのようにこれはソートに影響しますか?

  2. このメソッドはthis.name.compareTo(d.name)を返します。 this.nameには何がありますか?

丁寧に説明してください。あなたはおそらく推測したよう

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

何をしていても、無意味です。 'Dog'は' Comparator 'を実装するべきではありません。 'Comparator 'を実装する別のクラス(おそらく匿名)が必要です。その間、あなたは 'this.name'が何になると思いますか?この犬の名前は、別の犬と比較されています。 –

+0

「比較」の場合、犬の年齢が同じ場合は同じです。それ以外の場合は、最初の犬が古い場合は、正の数、2番目の犬、負の数を返します。 – Compass

+0

@louis私は残念です。 – Sri

答えて

0

は、は、2つのオブジェクトを比較するために使用されているのcompareToを比較します。それは

compare(a, b)仕組み

は、オブジェクトAおよびBを比較します。戻り値が< 0の場合、aはbより小さい。値が0の場合、両方のオブジェクトは等しいです。それが0よりも優れているならば、aはbより大きい。

a.compareTo(b)もオブジェクトaとbを比較します。戻り値はcompareと同じ方法で動作します。しかし、それを呼び出すときに、aがnullでないことに注意する必要があります。そうでない場合は、NullPointerExceptionがスローされます。

クラスが一つだけ比較方式が必要な場合は

をそれを使用する場合は、その後、唯一compareToを使用して結構です。

しかし、Dogをいくつかの方法で並べ替える必要がある場合、たとえば年齢別と別の時間別に並べ替える場合などは、Comparatorが便利になります。年齢別に名前を付け、名前別に並べ替える2つのComparator<Dog>を作成することができます。 sortのようなメソッドを呼び出すときに、あなたが望むソートを得るために使用したいコンパレータを引数として指定します。

あなたの質問への相対

キーワードthisは、現在の犬のインスタンスを参照します。したがって、this.nameは現在のDogインスタンスの名前です。

0

CompareTo()は、オブジェクトの「自然順序」を定義するために使用され、どちらのオブジェクトが「より大きい」かを判断するintを作成し、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 

compare()とは異なるソート方法は、compareTo()をどのように実装するかにかかっています。相続人

にphoneNumber 3つのフィールド有すると仮定方法の例:areaCode接頭LINENUMBER:比較ながら(

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 
      } 

)は、2つのオブジェクトを取得し、それらのフィールドの間の値を比較し、そしてコンパレータ

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答えははるかに精巧でarticulaを持って実装コンパレータと同等品についての説明。

関連する問題