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ステートメントを確認するために保持しましたが、それがどのように呼び出されるのか本当に理解していません。私はそれがマージソートで動作することを知っています。しかし、どのように?私を助けてください。

-バラジ

4

3 に答える 3

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()比較し、それらが等しくテストされない限り、その比較を返すことです。それらが等しい場合は、名前を比較した結果を返します。

余談ですが、これがコードの場合は、raw型の代わりにジェネリックを使用する方がよいでしょう。宣言する

class Employee implements Comparable<Employee> {...

compareTo次に、署名を使用してメソッドを宣言します。

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

また、メソッド内のキャストを省くことができます(また、クライアントコードの型の安全性を向上させることもできます)。

于 2012-04-11T03:56:55.513 に答える
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番目のソートキーとして名前で比較されます。

于 2012-04-11T03:57:34.250 に答える
0

2人はすでにcompareTo()メソッドが何をするかを説明しましたが、あなたが言ったので

しかし、私はそれがどのように呼ばれるのか本当に理解していません

その部分を説明します。Collections.sort(allEmpls)が呼び出されると、すべてのリストオブジェクトのcompareTo()メソッドが相互に呼び出されます。これは、それらがすべてComparableインターフェイスを実装しているためです。次に、sort()メソッド内のコードは、compareTo()値に基づいてオブジェクトを再編成します。そしてそれはそれについてです(もちろん、過度に単純化されていますが、それはあなたの質問に答えます)。

于 2012-04-11T04:10:39.480 に答える