首页 > 解决方案 > 如何通过在 kotlin 中使用过滤器对列表中的元素进行排序?我的方法有什么问题?

问题描述

val spices = listOf("curry", "pepper", "cayenne", "ginger", "red curry", "green curry", "red pepper" )    
spices.filter { it }.sortedBy { it.length }

错误:类型推断失败:inline fun Iterable.filter(谓词:(T)-> Boolean):列表无法应用于接收者:列表参数:((字符串)->字符串)

香料过滤器 { it }.sortedBy { it.length } ^ 错误:类型不匹配:推断类型是(字符串)-> 字符串但(字符串)-> 布尔值是预期的

标签: kotlin

解决方案


filter需要一个返回布尔值的谓词。见声明:

public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

(T) -> BooleanT表示它返回一个布尔值并接受 T 类型的输入。it在这种情况下。

字符串不是布尔值。如果你实际上有一个布尔列表,你可以这样做:

val list = listOf(true, true, false, true, true, false )
val sortedList = list.filter{ it }

它是有效的,因为它是一个布尔值。但是,对于所有其他类型,如果您打算进行过滤,则需要将其转换为布尔运算。

但是,由于您实际上似乎没有进行任何过滤,只需将其删除并执行以下操作:

val sortedList = spices.sortedBy { it.length }

如果您必须以某种方式对其进行过滤,请确保您获得布尔运算或值。

为了实际对其进行排序,您必须对 value 做一些事情sortedBy。在我的示例中,我将其分配给一个新字段,但您也可以将其分配给前一个字段。但是,如果您这样做,则必须将其设为 avar而不是 a val


推荐阅读