【问题标题】:Will you get descending order if you reverse list of objects which is sorted by ascending order?如果您反转按升序排序的对象列表,您会得到降序吗?
【发布时间】:2017-07-12 22:06:20
【问题描述】:

考虑以下带有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)

【问题讨论】:

  • 说,一个排序列表是[1, 2, 3, 4],并且将它反转得到[4, 3, 2, 1]。这是你说的场景吗?
  • 是的。但我正在排序 Class 对象,而不是原语。
  • 比较什么并不重要,因为您告诉 Java 如何比较您的对象。而Collections.reverse(list) 只是还原列表,无需进一步比较。
  • 仅供参考:您的 compare(int a, int b) 方法已由 Java 7+ 运行时库实现:Integer.compare(int a, int b)

标签: java sorting


【解决方案1】:

是的,反转一个按升序排序的列表,将得到按降序排序的列表。

但是,它可能不会得到与按降序排序列表相同的结果。

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

如果您的列表有多个对象,根据Comparator 是“相等的”,但不完全相同(即可以区分),反转列表将反转它们的顺序,但降序排序将使它们保持顺序.

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

如果您仅按姓氏排序,John DoeJim Doe 是相等的,并且将保持该顺序。

所以,升序排序给你:John DoeJim DoeJane Smith
倒车给你:Jane Smith, Jim Doe, John Doe

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

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

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

【讨论】:

  • 谢谢@Andreas。虽然我认为我不会得到你提到的问题,但如果我对姓氏和名字都进行排序(按升序排列)。对吗?
  • @JoseDaniels 除非您按全名排序,但有两个不同年龄的Joe Smith,那么您仍然可以按年龄顺序检测到差异。这对你来说可能无关紧要。这个答案只是为了确保您知道 Ascending + Reverse 并不总是与 Descending 相同,除非 order 是 absolute,即没有两个不同的对象被排序相等。如果您的对象来自数据库,它们通常都有唯一的 ID,因此可以使用最终的 ID 比较来确保绝对排序,如果这很重要的话。我经常在 SQL 查询中这样做,以确保一致排序。
  • 同意。我总是将_id 附加到排序字段。
  • @JoseDaniels:请参阅stackoverflow.com/a/8312128/56778 了解稳定和不稳定排序之间区别的简单说明。
【解决方案2】:

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

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

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

【讨论】:

  • ... 或直接按逆自然顺序排序,例如自定义Comparator,以扩展答案。
  • 是的,这是另一种方法。
猜你喜欢
  • 2016-10-18
  • 2018-05-03
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 2020-11-09
  • 2011-08-25
  • 2021-08-23
相关资源
最近更新 更多