Как определить последовательность Котлина, которая упорядочена - PullRequest
0 голосов
/ 07 сентября 2018

Есть ли способ установить состояние Sequence в Котлине, чтобы сообщить ему, что данные упорядочены?

Я знаю, что могу создать Kotlin Sequence следующим образом:

generateSequence(0) { it + 1 }.windowed(size = 100, step = 1)

Я полагаю, что некоторые операции над этой последовательностью более эффективны, если известно, что последовательность упорядочена. Например, distinct(). Если последовательность не в порядке, потребуется использовать временное хранилище. Есть ли способ сгенерировать эту последовательность и сообщить Kotlin, что мы знаем, что данные уже отсортированы?

1 Ответ

0 голосов
/ 22 октября 2018

Поскольку последовательности являются ленивыми и потенциально бесконечными, любая концепция упорядочения, кроме упорядочения sequence , будет порочна для обработки. Итерируя, как вы можете узнать, что нашли следующее (наибольшее) значение?
То есть даже не ясно, что «отсортированная (бесконечная) последовательность» является четко определенной, не говоря уже о полезной концепции (в контексте библиотеки программирования; в математике это, конечно, прекрасно!).

В зависимости от того, что вы планируете делать с результирующей коллекцией, вы можете использовать отсортированные наборы:

generateSequence(0) { it + 1 }.windowed(size = 100, step = 1).
        toSortedSet(Comparator { o1, o2 -> o1.sum() - o2.sum() })

Вы определили последовательность списков, и само по себе не ясно, как их упорядочить.

Предостережения:

  • Больше не ленивый.
  • Дубликаты не допускаются; в библиотеке Kotlin, по-видимому, отсутствует реализация с множеством множеств (или сумкой, или подсчитанным множеством, или ...). Легко моделировать, составляя значения в парах со счетчиками.
  • Некоторые операции обходятся дороже, чем линейная последовательность без гарантии заказа.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...