Kotlin Koans 40 Generic functions

目次

Generic functions (Playground)

Description

Make the following code compile by implementing a partitionTo function that splits a collection into two collections according to the predicate.

コレクションを predicate (真偽値を返す)にしたがって2つのコレクションに分割する partitionTo 関数を実装し、次のコードがコンパイルできるようにしてください。

There is a partition() function in the standard library that always returns two newly created lists. You should write a function that splits the collection into two collections given as arguments. The signature of the toCollection() function from the standard library may help you.

標準ライブラリには、常に2つの新しく作成されたリストを返す partition() 関数があります。コレクションを、引数として与えられた2つのコレクションに分割する関数を実装する必要があります。標準ライブラリの toCollection() 関数のシグネチャが役に立つかもしれません。

Code

import java.util.*

fun <T, C: MutableCollection<T>> Collection<T>.partitionTo(first: C, second: C, predicate: (T) -> Boolean): Pair<C, C> {
    for (element in this) {
        if (predicate(element)) {
            first.add(element)
        } else {
            second.add(element)
        }
    }
    return Pair(first, second)
}

fun partitionWordsAndLines() {
    val (words, lines) = listOf("a", "a b", "c", "d e").
            partitionTo(ArrayList<String>(), ArrayList()) { s -> !s.contains(" ") }
    words == listOf("a", "c")
    lines == listOf("a b", "d e")
}

fun partitionLettersAndOtherSymbols() {
    val (letters, other) = setOf('a', '%', 'r', '}').
            partitionTo(HashSet<Char>(), HashSet()) { c -> c in 'a'..'z' || c in 'A'..'Z'}
    letters == setOf('a', 'r')
    other == setOf('%', '}')
}

← Posts