【问题标题】:Sorting on Multiple fields -- Its working, but not able to understand how is it working.对多个字段进行排序——它的工作原理,但无法理解它是如何工作的。
【发布时间】:2012-04-11 03:51:00
【问题描述】:
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 语句以查看,但我真的不明白它是如何被调用的。我知道它与合并排序一起工作。但如何?请帮帮我。

-巴拉吉

【问题讨论】:

    标签: java collections core


    【解决方案1】:

    排序基于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) {...
    

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

    【讨论】:

      【解决方案2】:
       @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,然后按名称作为二级排序键进行比较。

      【讨论】:

        【解决方案3】:

        两个人已经解释了 compareTo() 方法的作用,但既然你说

        但我真的不明白它是如何被调用的

        我会解释那部分。当调用 Collections.sort(allEmpls) 时,所有列表对象的 compareTo() 方法都会相互调用,因为它们都实现了 Comparable 接口。然后 sort() 方法中的代码根据它们的 compareTo() 值重新组织对象。就是这样(当然,过于简化了,但它回答了你的问题)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-18
          • 1970-01-01
          • 2014-04-08
          • 2012-01-24
          • 1970-01-01
          相关资源
          最近更新 更多