2012-04-11 6 views
2
class Employee implements Comparable{ 
    private String name; 
     private String gender; 

     Employee(String name, String gender) { 
      this.name = name; 
      this.gender = gender; 
     } 

     public String getName() { 
       return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getGender() { 
       return gender; 
     } 

     public void setGender(String gender) { 
       this.gender = gender; 
     } 

     public String toString() { 
      return this.getName() + " : " + this.getGender(); 
     } 

     @Override 
     public int compareTo(Object o) { 
      int gendarComp=this.getGender().compareTo(((Employee)o).getGender()); 
      return (gendarComp!=0?gendarComp:this.name.compareTo(((Employee)o).getName())); 
     } 
    } 

    class EmployeeExec { 
     public static void main(String[] args) { 
      List allEmpls = new ArrayList(); 
      allEmpls.add(new Employee("vijay", "m")); 
      allEmpls.add(new Employee("balaji", "m")); 
      allEmpls.add(new Employee("shaifali", "f")); 
      allEmpls.add(new Employee("archana", "f")); 
      allEmpls.add(new Employee("alala", "m")); 
      allEmpls.add(new Employee("kiran", "f")); 

      sortEmployees(allEmpls); 
     } 

     public static void sortEmployees(List allEmpls) { 
      Collections.sort(allEmpls); 
      System.out.println(allEmpls); 
     } 
    } 

どのように動作しているか理解できますか?並べ替えるべき根源は何ですか?私はいくつかのsysoutステートメントを見ていましたが、実際にどのように呼び出されているのか分かりません。私はマージソートの作業を知っています。しかしどのように?私を助けてください。複数のフィールドで並べ替える - 動作しますが、どのように動作しているか理解できません。

-Balaji

答えて

2

ソートは(わずかに読みやすいように再フォーマット)compareToの戻り値に基づいている:

@Override 
public int compareTo(Object o) { 
    int gendarComp = this.getGender().compareTo(((Employee)o).getGender()); 
    return (gendarComp != 0 
       ? gendarComp 
       : this.name.compareTo(((Employee)o).getName()) 
      ); 
} 

それらはテストしない限り、論理は、getGender()の値を比較し、その比較を返すことが明らかです等しい。等しい場合は、名前を比較した結果を返します。

脇に:これがあなたのコードの場合、生の型の代わりにジェネリックを使用する方がよいでしょう。

@Override 
public int compareTo(Employee o) {... 

、あなたは(だけでなく、クライアントコードで型の安全性を向上させる)メソッド内のキャストで済ますことができます。そして、署名付きcompareToメソッドを宣言

class Employee implements Comparable<Employee> {... 

を宣言します。

1
@Override 
public int compareTo(Object o) { 
    int gendarComp=this.getGender().compareTo(((Employee)o).getGender()); 
    return (gendarComp!=0 ? 
          gendarComp 
          : this.name.compareTo(((Employee)o).getName())); 
} 

ご覧のとおり、コードは最初に性別を比較します。

性別が等しい場合、結果の整数は0になり、次に2次ソートキーとして名前を比較します。

0

二人はすでにのcompareTo()メソッドが何を説明していますが、

を言ったので、私は本当に私はその部分を説明しましょう、それは

呼ばなっているかを理解いけません。 Collections.sort(allEmpls)が呼び出されると、リストオブジェクトのcompareTo()メソッドはすべて、Comparableインタフェースを実装するため、すべてのオブジェクトに対して呼び出されます。 sort()メソッド内のコードは、compareTo()値に基づいてオブジェクトを再編成します。それはそれについてです(もちろん単純すぎる、しかしそれはあなたの質問に答える)。

関連する問題