我有一个 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/

10-11 04:54