#kotlin
#kotlin
Вопрос:
Предположим, что мы ищем последовательность в списке, и эта последовательность должна удовлетворять некоторым условиям, например, у меня есть ряд чисел, подобных этому:
[1,2,4,6,7,8,12,13,14,15,20]
Мне нужно найти самую большую последовательность, чтобы ее последовательные элементы имели разницу в 1, поэтому я ожидал получить:
[12,13,14,15]
Мне любопытно, есть ли какой-либо способ получить в Kotlin Sequence
или встроенные функции, такие как groupBy
или что-то еще.
PS: Я знаю, как создавать последовательности, вопрос в том, как оценивать и извлекать некоторые последовательности с заданными условиями.
Ответ №1:
Для распознавания этой «последовательности» нет встроенной функциональности, но вы могли бы решить ее с fold
помощью операции:
val result = listOf(1, 2, 3, 12, 13, 14, 15)
.distinct() // remove duplicates
.sorted() // by lowest first
.fold(mutableListOf<Int>() to mutableListOf<List<Int>>()) { (currentList, allLists), currentItem ->
if (currentList.isEmpty()) { // Applies only to the very first item
mutableListOf(currentItem) to allLists
} else {
if (currentItem - currentList.max()!! == 1) { // Your custom sequence recognition 'difference of 1'
currentList.apply { add(currentItem) } to allLists
} else {
mutableListOf(currentItem) to allLists.apply { add(currentList) } // Next
}
}
}
.let { it.second.apply { add(it.first) } } // Add last list
.maxBy { it.size } // We need the longest pattern - which will take first of the stack - it could be multiple.
// If you need more precise list, sort them by your criteria