Как я могу применить предикат к одному массиву и использовать результат для получения значений из другого в Kotlin - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть 2 массива (на самом деле они двухмерные, но я не думаю, что это важно для вопроса)

val arr1 = arrayOf<Char>('a', 'b', 'c', 'd', 'e', 'b')
val arr2 = arrayOf<Char>('z', 'y', 'x', 'w', 'v', 'u')

Я пытаюсь реализовать следующий метод

fun filter(predicate: (T?) -> Boolean): Collection<Char> { ... }

Приведенные выше массивы упрощены, так как содержимое arr1 в реальном коде является обнуляемым универсальным (T?), Но я предполагаю, что мы можем продолжать в том же духе для вопроса.

Так что я пытаюсьДля этого нужно применить предикат к первому массиву и получить значения из соответствующих индексов из второго.

Итак, допустим, я пытаюсь

val res = obj.filter { it == 'b' }

Я бы хотел получить коллекцию с 'y' и 'u'.

Я ходил по домам по этому поводу, так что я думаю, что пропустил правильный путь.Моя последняя попытка была похожа на (использовал flatten, так как это двумерный массив)

val newList = arr1.flatten().mapIndexed{idx, it -> predicate}

Затем я мог бы использовать это для получения значений из arr2 (предполагая, что они всегда согласованно сглаживаются?)

Мой вопрос, я думаю, либо:

а) Как мне получить список индексов, используя mapIndexed с предикатом, или б) Как лучше это сделать (я предполагаю, что я взялнеправильный подход)

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Zip списки и использовать расширение

fun <Any> List<Pair<Any,Any>>.myfilter(c: Any): List<Any>{
    val result: MutableList<Any> = mutableListOf()
    for(item in this){
        if(item.first == c)
            result.add(item.second)
    }
    return result
}

fun main(args: Array<String>){
    val arr1 = arrayOf<Char>('a', 'b', 'c', 'd', 'e', 'b')
    val arr2 = arrayOf<Char>('z', 'y', 'x', 'w', 'v', 'u')

    val zipped: List<Pair<Char,Char>> = arr1 zip arr2

    print(zipped.myfilter('e'))
}
0 голосов
/ 15 ноября 2018
val result = (arr1 zip arr2)
    .filter { (c1, _) -> predicate(c1) }
    .map { (_, c2) -> c2 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...