Одно простое решение состоит в использовании отдельных map
вызовов, чтобы получить xs
и ys
от ваших Value
с: например
fun collectionOf(values: List<Value>) =
Collection(values.map { it.x },
values.map { it.y })
Использование:
val values = listOf(Value(1, 2), Value(3, 4))
val collection = collectionOf(values) // Collection(xs=[1, 3], ys=[2, 4])
Если вы хотите сделать это в одной итерации над Value
s, вы можете использовать простой цикл for
:
fun collectionOf(values: List<Value>) {
val xs = mutableListOf<Int>()
val ys = mutableListOf<Int>()
for ((x, y) in values) {
xs.add(x)
ys.add(y)
}
return Collection(xs, ys)
}
Поскольку Collection
содержит только для чтения списков, я не вижу простой способ построить его, чем сначала сделать списки, конечно, не считая выразительных еще неэффективные функциональные решения, как этот, который копирует xs
и ys
на каждая итерация:
fun collectionOf(values: List<Value>) =
values.fold(Collection(listOf(), listOf())) { acc, it ->
Collection(acc.xs + it.x, acc.ys + it.y)
}
Спасибо. Я запустил все три, и метод карты занимает наименьшее количество времени для 100000 списка элементов. Я поставлю код запуска в отдельном ответе, чтобы люди могли проверить, выбирают ли они. –