Найти подпоследовательность в списке

#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