Java 若你们颠倒按升序排序的对象列表,你们会得到降序吗?

Java 若你们颠倒按升序排序的对象列表,你们会得到降序吗?,java,sorting,Java,Sorting,考虑以下带有Pojo对象的列表: List<Pojo> list = new ArrayList<>(); .... class Pojo { private int field1; private int field2; ... } 在这里,我将按升序对列表进行排序 我的问题是:如果我颠倒列表,我会得到降序吗 我正在调用Collections.reverse(list)调用Collections.reverse(list)将在列表处于当前状态时

考虑以下带有
Pojo
对象的列表:

List<Pojo> list = new ArrayList<>();
....
class Pojo {
    private int field1;
    private int field2;
    ...
}
在这里,我将按升序对列表进行排序

我的问题是:如果我颠倒列表,我会得到降序吗


我正在调用
Collections.reverse(list)
调用
Collections.reverse(list)
将在列表处于当前状态时反转列表。例如,如果您的列表是
[4,1,3,2]
,并且您调用
reverse()
,它将成为
[2,3,1,4]
。它不会与它们的自然顺序相反(除非列表已经处于其自然顺序)

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

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

是的,颠倒一个按升序排序的列表,将得到按降序排序的列表

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

这是因为保证是稳定的,即相等的元素不会因排序而重新排序

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

示例:假设您有一个姓名列表:
John Doe
Jane Smith
Jim Doe

如果只按姓氏排序,
John Doe
Jim Doe
是相等的,并将按顺序排列

因此,升序排序为您提供:
John Doe
Jim Doe
Jane Smith

相反,你会发现:
Jane Smith
Jim Doe
John Doe

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

一个稳定的降序排序为您提供:
Jane Smith
John Doe
Jim Doe


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

比如,一个排序的列表是
[1,2,3,4]
,反转它会得到
[4,3,2,1]
。这就是你所说的情景吗?是的。但我是对类对象进行排序,而不是对原语进行排序。比较什么并不重要,因为您告诉Java如何比较对象。和
Collections.reverse(list)
只还原列表,无需进一步比较。仅供参考:您的
compare(int a,int b)
方法已由Java 7+运行库实现:。。。或者直接按照相反的自然顺序排序,例如通过自定义的
比较器来扩展答案。是的,这是另一种方式。谢谢@Andreas。虽然我想我不会理解你提到的问题,但如果我同时对姓和名进行排序(按升序排列)。对吗?@JoseDaniels除非你按全名排序,但是有两个不同年龄的乔·史密斯,那么你仍然能够按年龄顺序检测到差异。这对你可能没关系。这个答案只是为了确保您知道升序+倒序并不总是与降序相同,除非顺序是绝对的,即没有两个不同的对象的顺序是相等的。如果您的对象来自数据库,它们通常都有唯一的ID,因此如果这很重要,可以使用最终的按ID比较来确保绝对顺序。我经常在SQL查询中这样做,以确保一致的顺序。同意。我总是将
\u id
附加到排序字段。@JoseDaniels:有关稳定排序和不稳定排序之间区别的简单解释,请参阅。
Collections.sort(list);
Collections.reverse(list);