如何使用Kotlin中的过滤器对字符串列表中的元素进行排序?我的方法有什么问题?

时间:2018-06-30 11:49:55

标签: kotlin

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

错误:类型推断失败:内联乐趣Iterable.filter(predicate:(T)-> Boolean):列表 不适用于 接收器:列表参数:(((String)-> String)

spices.filter {it} .sortedBy {it.length}        ^ 错误:类型不匹配:推断的类型为(String)-> String,但预期为(String)->布尔值 Spices.filter {it} .sortedBy {it.length}

4 个答案:

答案 0 :(得分:1)

第二行代码应为:

val curry = spices.filter { it.contains("curry", true) }

最重要的是,我们需要将咖喱列表的长度排序。使用(。)运算符和sortedBy()会出现错误:

val currySorted = spices.filter { it.contains("curry", true) }.sortedBy { it.length }

有没有一种方法可以一次性过滤列表?

更新:.sortedBy方法可以正常工作。结果显示在REPL中很奇怪:

for (i in 0..currySorted.size-1) println(currySorted[i])

在REPL中给出以下结果: 咖喱咖喱绿咖喱

更精确地观看它是有序的!但REPL会在输出中添加字符串:咖喱,红咖喱,绿咖喱

顺便说一下,这项作业来自Udacity的Kotlin训练营课程

答案 1 :(得分:0)

过滤器需要在括号内使用谓词,it不是谓词。 您不需要过滤器即可对列表进行排序

只需:

val spices = mutableListOf<String>("curry", "pepper", "cayenne", "ginger", "red curry", "green curry", "red pepper" )
spices.sortBy { it.length }

也从listOf更改为mutableListOf

答案 2 :(得分:0)

filter要求谓词返回布尔值。参见声明:

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

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

字符串不是布尔值。如果您确实有一个布尔值列表,则可以执行以下操作:

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

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

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

val sortedList = spices.sortedBy { it.length }

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

要对其进行实际排序,您必须对值sortedBy进行处理。在我的示例中,我将其分配给新字段,但是您也可以将其分配给上一个字段。但是,如果执行此操作,则必须将其设置为var,而不是val

答案 3 :(得分:0)

我正在上同样的课程,对我有用的是:

spices.filter { it.contains("curry") }.sortedBy { it.length }.reversed()

首先查找所有带有“ curry”的条目,然后按最短到最长的顺序对其进行排序,然后您只需颠倒顺序即可。