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}
答案 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类型的输入。在这种情况下,T
是it
。
字符串不是布尔值。如果您确实有一个布尔值列表,则可以执行以下操作:
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”的条目,然后按最短到最长的顺序对其进行排序,然后您只需颠倒顺序即可。