【发布时间】:2019-08-25 07:00:48
【问题描述】:
据我所知,Comparator.comparingInt() 应按升序排序,Comparator.comparingInt().reversed 应按降序排序。但我发现了一个相反的情况。
用一个例子可以更好地解释这一点。以下是我的代码。
金额类:
class Amount
{
int lineNum;
int startIndex;
Double value;
//Getters , setters and toString.
}
主要方法:
public static void main( String[] args )
{
List<Amount> amounts = new ArrayList<>();
amounts.add( new Amount( 1.0, 5, 10 ) ); //LINE_NUM 5
amounts.add( new Amount( 3.0, 9, 30 ) );
amounts.add( new Amount( 2.0, 3, 40 ) );
amounts.add( new Amount( 9.0, 5, 20 ) ); //LINE_NUM 5
amounts.add( new Amount( 6.0, 1, 50 ) );
amounts.add( new Amount( 4.0, 5, 20 ) ); //LINE_NUM 5
System.out.println( ".............BEFORE SORTING.........." );
amounts.forEach( System.out::println );
amounts.sort(
Comparator.comparingInt( Amount::getLineNum ) //NOTE THIS
. .thenComparingInt( Amount::getStartIndex ).reversed()
.thenComparingDouble( Amount::getValue ) );
System.out.println( "\n\n.............AFTER SORTING.........." );
amounts.forEach( System.out::println );
}
我想要按 lineNum 升序、startIndex 降序和 value 升序排序的数量列表。
所以我的期望是这样的。
......排序后............(期望)
金额 [lineNum=1, startIndex=50, value=6.0]
金额 [lineNum=3, startIndex=40, value=2.0]
金额 [lineNum=5, startIndex=20, value=4.0]
金额 [lineNum=5, startIndex=20, value=9.0]
金额 [lineNum=5, startIndex=10, value=1.0]
金额 [lineNum=9, startIndex=30, value=3.0]
......排序后............(实际)
金额 [lineNum=9, startIndex=30, value=3.0]
金额 [lineNum=5, startIndex=20, value=4.0]
金额 [lineNum=5, startIndex=20, value=9.0]
金额 [lineNum=5, startIndex=10, value=1.0]
金额 [lineNum=3, startIndex=40, value=2.0]
金额 [lineNum=1, startIndex=50, value=6.0]
除了lineNum order之外,一切都是正确的。金额按 lineNumber 降序排序,而我预计它会按升序。
当我将比较器更改为跟随时,结果符合预期
amounts.sort(
Comparator.
comparingInt( Amount::getLineNum ).reversed()
.thenComparingInt( Amount::getStartIndex ).reversed()
.thenComparingDouble( Amount::getValue ) );
这很奇怪,因为 comparingInt( Amount::getLineNum ).reversed() 应该按行号降序对金额进行排序。
我注意到的另一件事是,StartIndex 比较 按预期工作。但按行号比较部分不是。
谁能解释一下?
【问题讨论】:
标签: java sorting lambda comparator comparable