Поток Java сортируется по 2 полям - PullRequest
0 голосов
/ 30 мая 2018

У меня есть список элементов, которые мне нужно отсортировать по 2 параметрам, первый параметр - orderIndex, и у меня эта часть работает правильно (см. Ниже), второй параметр после orderIndex - сумма.Таким образом, в основном, первые элементы должны быть предметами с наименьшим порядковым индексом, и они должны быть отсортированы по количеству.

result.stream().sorted { s1, s2 -> s1.intervalType.orderIndex.compareTo(s2.intervalType.orderIndex) }.collect(Collectors.toList())

На данный момент у меня есть этот код, и он сортируется только по orderIndex, второй параметр количествонаходится по адресу s1.item.amount.

Есть идеи, как обновить этот код с помощью второго параметра порядка?

Я нашел этот пример

persons.stream().sorted(Comparator.comparing(Person::getName).thenComparing(Person::getAge));

Мой вопрос здесь, как получить доступ к другому объекту в Person, например, в моем случае у меня есть объект IntervalType в объекте, который я сортирую, и мне нужно использовать intervalType.orderIndex

Примечание:

Только дляобратите внимание, мне нужно это в Kotlin, а не в Java.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Я нашел лучший способ сделать это, так как я использую Kotlin, это можно сделать так:

result.sortedWith(compareBy({ it.intervalType.orderIndex }, { it.item.amount }))
0 голосов
/ 31 мая 2018

Если вы делаете это с Kotlin - вы должны сделать это способом Kotlin.

вздымалась Internal класс

class Internal(val orderIndex: Int, val ammount: Int)

Вы можете легко написать любую комбинацию компараторов с помощью compareBy

// result: List<Internal>
result.sortedWith(compareBy( {it.orderIndex}, {it.ammount} ))

В вашей задаче нет необходимости в потоках, вы можете сделать это directclty.Если вам нужны именно потоки - используйте этот compareBy агрегат внутри потока:

result.stream().sorted(compareBy( ... ).collect( ... )
0 голосов
/ 30 мая 2018

Вы можете использовать Comparator для сортировки данных с использованием потоков

//first comparison
Comparator<YourType> comparator = Comparator.comparing(s -> s.intervalType.orderIndex);

//second comparison
comparator = comparator.thenComparing(Comparator.comparing(s-> s.item.amount));

//sorting using stream
result.stream().sorted(comparator).collect(Collectors.toList())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...