如何在Kotlin中将谓词应用于一个数组并使用结果从另一个数组获取值

时间:2018-11-15 12:13:11

标签: kotlin

我有2个数组(它们实际上是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”的集合。

我一直在到处走走,所以我想我错过了正确的方法。我的最后一次尝试是沿着(使用扁平化,因为它是一个二维数组)

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

然后我可以使用它来从arr2中获取值(假设它们始终保持一致?)

我想我的问题是

a)如何使用带谓词的mapIndexed获取索引列表 要么 b)更好的方法是什么(我假设我采用了错误的方法tbh)

2 个答案:

答案 0 :(得分:4)

val result = (arr1 zip arr2)
    .filter { (c1, _) -> predicate(c1) }
    .map { (_, c2) -> c2 }

答案 1 :(得分:1)

压缩列表并使用扩展名

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'))
}