Насколько я знаю, 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 и по возрастанию значения.
Итак, я ожидал, что это так.
............. ПОСЛЕ СОРТИРОВКИ .......... ( ОЖИДАНИЕ )
Сумма [lineNum = 1, startIndex = 50, значение = 6.0]
Сумма [lineNum = 3, startIndex = 40, значение = 2.0]
Сумма [lineNum = 5, startIndex = 20, значение = 4.0]
Сумма [lineNum = 5, startIndex = 20, значение = 9.0]
Сумма [lineNum = 5, startIndex =10, значение = 1,0]
Сумма [lineNum = 9, startIndex = 30, значение = 3,0]
............. ПОСЛЕ СОРТИРОВКИ .......... ( ACTUAL )
Сумма [lineNum = 9, startIndex = 30, значение = 3.0]
Сумма [lineNum = 5, startIndex =20, значение = 4,0]
Сумма [lineNum = 5, startIndex = 20, значение = 9,0]
Сумма [lineNum = 5, startIndex = 10, значение = 1,0]
Сумма [lineNum = 3, startIndex = 40,value = 2.0]
Сумма [lineNum = 1, startIndex = 50, value = 6.0]
Все было правильно, за исключением lineNum order .Суммы были отсортированы по убыванию lineNumber , в то время как я ожидал, что они будут в порядке возрастания .
Результаты быликак и ожидалось, когда я изменил Comparator на следующий
amounts.sort(
Comparator.
comparingInt( Amount::getLineNum ).reversed()
.thenComparingInt( Amount::getStartIndex ).reversed()
.thenComparingDouble( Amount::getValue ) );
, что странно, поскольку comparingInt( Amount::getLineNum ).reversed()
должен был сортировать суммы по убыванию номера строки.
Еще одна вещь, которую я заметил, это Сравнение по StartIndex работает как положено.Но Сравнение по lineNumber часть не является.
Может кто-нибудь объяснить это?