我有一个 Triple 列表,它是一个用户定义的类。当我使用 Comparator
对其进行排序时,它显示出奇怪的行为。
List<Triple> list = new ArrayList<>();
list.add(new Triple(1,12,13)); //adding values to list
list.add(new Triple(11,3,31));
list.add(new Triple(16,6,32));
list.add(new Triple(16,8,32));
list.add(new Triple(16,7,32));
list.add(new Triple(16,9,32));
list.add(new Triple(16,5,32));
list.add(new Triple(7,21,0));
list.add(new Triple(6,22,12));
list.add(new Triple(4,22,13));
list.add(new Triple(2,77,3));
list.add(new Triple(1,8,30));
list.sort(
Comparator.comparingInt(Triple::getA)
.thenComparingInt(Triple::getB)
.thenComparing(Triple::getC));
list.forEach(e->System.out.printf("(%d,%d,%d) ",e.getA(),e.getB(),e.getC()));
System.out.println();
//sort A descending if for same A ascending B and for same B ascending C
list.sort(
Comparator.comparingInt(Triple::getA).reversed()
.thenComparingInt(Triple::getB)
.thenComparing(Triple::getC));
list.forEach(e->System.out.printf("(%d,%d,%d) ",e.getA(),e.getB(),e.getC()));
System.out.println();
//sort A ascending if for same A descending B and for same B ascending C
list.sort(
Comparator.comparingInt(Triple::getA)
.thenComparingInt(Triple::getB)
.reversed()
.thenComparing(Triple::getC));
list.forEach(e->System.out.printf("(%d,%d,%d) ",e.getA(),e.getB(),e.getC()));
System.out.println();
//sort A ascending if for same A ascending B and for same B descending C
list.sort(
Comparator.comparingInt(Triple::getA)
.thenComparingInt(Triple::getB)
.thenComparing(Triple::getC)
.reversed());
list.forEach(e->System.out.printf("(%d,%d,%d) ",e.getA(),e.getB(),e.getC()));
我希望输出如我在评论中所述的列表 -
(16,5,32) (16,6,32) (16,7,32) (16,8,32) (16,9,32) (11,3,31) (7,21,0) (6,22,12) (4,22,13) (2,77,3) (1,8,30) (1,12,13)
(16,9,32) (16,8,32) (16,7,32) (16,6,32) (16,5,32) (11,3,31) (7,21,0) (6,22,12) (4,22,13) (2,77,3) (1,12,13) (1,8,30)
(16,9,32) (16,8,32) (16,7,32) (16,6,32) (16,5,32) (11,3,31) (7,21,0) (6,22,12) (4,22,13) (2,77,3) (1,12,13) (1,8,30)
因此 reversed() 方法反转了早期的比较器条件。
供您引用,Triple 只是具有三个变量和 get set 方法的类。
最佳答案
由于您定义了一个像 Comparator.comparingInt(Triple::getA).thenComparingInt(Triple::getB)
这样的比较器,这将返回一个新的 Comparator
对象,其中包含以前比较对象的两种方式。如果你然后在这个 reversed
上调用 Comparator
它会返回新的 Comparator 来反转这个 Comparator
- 所以在这种情况下,前面的两个条件都将被反转。
如果您想反转链中的一个比较器,您可以使用以下内容:
.thenComparing(Triple::getB, Comparator.reverseOrder())
因此,您的比较器之一可能如下所示:
Comparator.comparingInt(Triple::getA)
.thenComparing(Triple::getB, Comparator.reverseOrder())
.thenComparing(Triple::getC)
这只会反转 B 属性排序条件。
关于java - Comparator.comparing().reversed() 反转所有早期的比较器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57636642/