如果你反转按升序排序的对象列表,你会得到降序吗?

时间:2017-07-12 22:06:21

标签: java sorting

使用Pojo对象考虑以下列表:

List<Pojo> list = new ArrayList<>();
....
class Pojo {
    private int field1;
    private int field2;
    ...
}

注意: Pojo可以有两个以上的字段

我按升序排序Pojo-s列表:

Collections.sort(list, new Comparator<Pojo>() {

    @Override
    public int compare(Pojo o1, Pojo o2) {
        int fieldCompareTo = compare(o1.field1, o2.field1);

            if (fieldCompareTo == 0) {
                fieldCompareTo = compare(o1.field2, o2.field2);

            }
            return fieldCompareTo;
        }
    });

private static int compare(int a, int b) {
    return a < b ? -1
         : a > b ? 1
         : 0;
}

这里我将按升序排序列表。

我的问题是:如果我撤销列表,我会降序吗?

我只是打电话给Collections.reverse(list)

2 个答案:

答案 0 :(得分:10)

是的,撤消按升序排序的列表将为您提供按降序排序的列表。

但是,它可能不会给您提供与按降序排序列表相同的结果。

这是因为Collections.sort()保证稳定,即等级元素不会因排序而重新排序。

如果您的列表有多个对象,那么根据Comparator是&#34;等于&#34;,但不完全相同(即可以区分),反转列表将颠倒它们的顺序,但是按降序排序将使它们按顺序排列。

示例:假设您有一个名单列表:John DoeJane SmithJim Doe

如果您只按姓氏对其进行排序,则John DoeJim Doe相同,并且会保持该顺序。

因此,升序排序可为您提供:John DoeJim DoeJane Smith
反转可以为您提供:Jane SmithJim DoeJohn Doe

这是按姓氏递减的顺序,但它与按降序排序列表不同。

稳定的降序排序可为您提供:Jane SmithJohn DoeJim Doe

当然,如果根据Comparator没有两个相等的元素,则反向按升序排序的列表与对列表降序进行排序完全相同。

答案 1 :(得分:2)

调用Collections.reverse(list)将反转列表,因为它存在于当前状态。例如,如果您的列表为[4,1,3,2],并且您致电reverse(),则该列表将变为[2,3,1,4]。它不会反转它们的自然顺序(除非列表已经按其自然顺序排列)。

为了让您的列表按自然顺序排列,您需要执行以下操作:

Collections.sort(list);
Collections.reverse(list);