在多个字段上排序 - 它的工作,但无法理解它是如何工作的。

时间:2012-04-11 03:51:00

标签: java collections core

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

3 个答案:

答案 0 :(得分: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()的值并返回该比较,除非它们测试相等。如果它们相等,则返回比较名称的结果。

顺便说一句:如果这是您的代码,那么使用泛型而不是原始类型会更好。声明

class Employee implements Comparable<Employee> {...

然后使用签名声明compareTo方法:

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

并且您可以省去方法内的强制转换(以及改善客户端代码中的类型安全性)。

答案 1 :(得分: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()值重新排序对象。这就是它(当然,过度简化,但它回答了你的问题)。