我刚刚开始学习kotlin,我偶然发现了这个小问题。我有一个对象列表,并在指定范围内过滤列表。能够获取范围内的对象,但是当我将范围更改为外部边界时,我得到一个空数组,
因此,为了使问题简单,我们假设有一个整数列表,如
original list [1, 2, 3, 4, 5, 6, 7]
并且我有一个dropper函数,它会过滤掉元素
工作条件
fun dropper(args: ArrayList<Int>): List<Int> {
return args.filter { it in 2..6 } // it >= 2 && it <= 6
}
输出
[2, 3, 4, 5, 6]
但是当我将范围更改为
时fun dropper(args: ArrayList<Int>): List<Int> {
return args.filter { it in 4..2 } // it <= 2 && it >= 4
// it in 4..2 , was suggested by the IDE
}
将输出作为空列表。
我非常确定列表值没有清除,因为在调用此函数之后,我将列表传递给另一个给出预期结果的操作。
答案 0 :(得分:3)
4..2
基本上是一个空范围,因为它会转换为it >= 4 && it <= 2
。要创建一个递减的范围,您必须使用downTo
:
args.filter { it in 4 downTo 2 }
在某些情况下, reversed
也可以替代:
args.filter { it in (2..4).reversed() }
这个具体问题也是Dan Lew最近blog post中第一个很好地涵盖范围的例子。
答案 1 :(得分:1)
使用downTo
。阅读Ranges了解详细说明。
范围(x..y
),这里x是起始索引,y是最后一个,它是增量方式。所以1..10
范围有10个元素,但10..1
看起来是10个on-wards所以它是一个空范围。您需要使用downTo
运算符。
更改您的代码如下:
fun dropper(args: ArrayList<Int>): List<Int> {
return args.filter { it in 4 downTo 2 } // it <= 2 && it >= 4
}
答案 2 :(得分:1)
您好,您需要使用operator downTo
fun main(args: Array<String>) {
var list = arrayListOf<Int>(1, 2, 3, 4, 5, 6, 7)
println(dropper(list)) // [2, 3, 4]
}
fun dropper(args: ArrayList<Int>): List<Int> {
return args.filter { it in 4 downTo 2 } // [2, 3, 4]
}
这里充分描述了如何使用范围。 - https://tools.ietf.org/html/rfc7662
答案 3 :(得分:1)
除了这些答案,我还发现!
操作也有效
fun dropper(args: ArrayList<Int>): List<Int> {
return args.filter { it !in 2..4 } // it <= 2 && it >= 4
}