java - 对多个字段进行排序——它可以工作,但无法理解它是如何工作的。

标签 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 语句来查看,但我不太明白它是如何被调用的。我知道它与合并排序一起使用。但如何呢?请帮助我。

-巴拉吉

最佳答案

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

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

关于java - 对多个字段进行排序——它可以工作,但无法理解它是如何工作的。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10099554/

相关文章:

java - 为什么我的查询结果没有打印出来?

java - 从 Perl 运行 screen

java - 将 JRE 与 Java 应用程序捆绑在一起

clojure future vs 延迟

java - 实现 java.util.Collection<E> 和重写方法时出现问题

java - 为什么最小化、还原可以在不为框架实现任何方法的情况下工作?

java - 获取空数组而不是随机生成的整数数组

java - 我想检查输入字符串的格式是否正确

java - Hibernate映射<基本,实体>映射(3个表)

python - 为什么 collections.Counter 比直接运行其源代码运行得更快