Создание комбинаций элементов в ArrayList [Kotlin] - PullRequest
1 голос
/ 08 мая 2019

У меня есть ArrayList элементов, которые мне нужны для получения комбинаций пар.

например.[A, B, C] будет преобразовано в [[A, B], [A, C], [B, C]]

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

for(i in 0 until arr.size-1)
    for(j in i+1 until arr.size)
        //do stuff with arr[i], arr[j]

, и если мне понадобятся комбинации из более чем двух элементов, я, вероятно, напишурекурсивная функция, чтобы сделать то же самое.Меня беспокоит то, что этот метод все еще старомоден и, возможно, не такой функциональный, как Котлин, как

Есть ли лучший способ добиться этого, а также использовать большее количество элементов в комбинации, не переходя в рекурсию?

1 Ответ

2 голосов
/ 08 мая 2019

Чтобы сделать его более функциональным, вы можете отделить производство пар от их потребления.

Генератор пар можно записать с помощью функции sequence:

fun <T> elementPairs(arr: List<T>): Sequence<Pair<T, T>> = sequence {
    for(i in 0 until arr.size-1)
        for(j in i+1 until arr.size)
            yield(arr[i] to arr[j])
}

Затем вы можете использовать эту последовательность и обрабатывать пары различными способами, например:

fun main() {
    elementPairs(listOf('A', 'B', 'C', 'D')).forEach {
        println(it)
    }

    elementPairs(listOf("apple", "desk", "arc", "density", "array"))
        .filter { (a, b) -> a.first() == b.first() }
        .forEach { println("Starting with the same letter: $it") }
}

Вы можете попробовать это здесь: https://pl.kotl.in/dJ9mAiATc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...