如何按不同时间的不同参数对列表进行排序

2022-08-31 10:49:34

我有一个命名的具有多个属性的类,例如:Person

public class Person {
    private int id;
    private String name, address;
    // Many more properties.
}

许多对象存储在 .我想按多个排序参数对此列表进行排序,并且会不时更改。例如,我可能一次想按升序排序,然后按降序排序,另一次只想按降序排序。PersonArrayList<Person>nameaddressid

我不想创建自己的排序方法(即,我想使用.实现此目的的最优雅的解决方案是什么?Collections.sort(personList, someComparator)


答案 1

我认为你的枚举方法基本上是合理的,但switch语句确实需要一种更加面向对象的方法。考虑:

enum PersonComparator implements Comparator<Person> {
    ID_SORT {
        public int compare(Person o1, Person o2) {
            return Integer.valueOf(o1.getId()).compareTo(o2.getId());
        }},
    NAME_SORT {
        public int compare(Person o1, Person o2) {
            return o1.getFullName().compareTo(o2.getFullName());
        }};

    public static Comparator<Person> decending(final Comparator<Person> other) {
        return new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                return -1 * other.compare(o1, o2);
            }
        };
    }

    public static Comparator<Person> getComparator(final PersonComparator... multipleOptions) {
        return new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                for (PersonComparator option : multipleOptions) {
                    int result = option.compare(o1, o2);
                    if (result != 0) {
                        return result;
                    }
                }
                return 0;
            }
        };
    }
}

用法示例(使用静态导入)。

public static void main(String[] args) {
    List<Person> list = null;
    Collections.sort(list, decending(getComparator(NAME_SORT, ID_SORT)));
}

答案 2

您可以为可能要排序的每个属性创建比较器,然后尝试“比较器链接”:-)喜欢这个:

public class ChainedComparator<T> implements Comparator<T> {
    private List<Comparator<T>> simpleComparators; 
    public ChainedComparator(Comparator<T>... simpleComparators) {
        this.simpleComparators = Arrays.asList(simpleComparators);
    }
    public int compare(T o1, T o2) {
        for (Comparator<T> comparator : simpleComparators) {
            int result = comparator.compare(o1, o2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}

推荐