В Kotlin последовательности есть функция takeWhile
, которая позволит вам брать элементы, пока они придерживаются определенного предиката. То, что я хотел бы сделать, это взять элементы в соответствии с этим предикатом, использовать их каким-либо образом, затем изменить предикат и принять следующий «пакет». До сих пор я не нашел способа сделать это исключительно с помощью того, что предлагают последовательности и итераторы.
Следующий фрагмент кода иллюстрирует проблему. Функция primeGenerator()
возвращает Sequence
простых (длинных) чисел. Предположим, что я хочу создать списки, в которых каждый список имеет простые числа с одинаковым количеством цифр. При создании каждого списка я бы использовал его для какой-то цели. Если список соответствует тому, что я искал, итерация может закончиться, в противном случае перейдите к следующему списку.
val primeIt = primeGenerator().iterator()
var digits = 1
var next: Long? = null
val currentList = ArrayList<Long>()
while (digits < 4) {
next?.also { currentList.add(it) }
next = primeIt.next()
if (next.toString().length > digits) {
println("Primes with $digits: $currentList")
currentList.clear()
digits++
}
}
В этом случае он заканчивается, когда число цифр превышает 3. Это работает нормально, но я был интересно, есть ли какой-то способ добиться того же с операциями, связанными исключительно с последовательностью или ее итератором. В основном чанкинг последовательности, но на основе предиката, а не установленного размера. Приведенный выше пример с простыми числами приведен только для иллюстрации, я придерживаюсь общего принципа, а не то, что будет работать только в этом случае.