列出外部范围内的过滤器 - KOTLIN

时间:2017-06-13 10:01:36

标签: list filter kotlin

我刚刚开始学习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
}

将输出作为空列表。

我非常确定列表值没有清除,因为在调用此函数之后,我将列表传递给另一个给出预期结果的操作。

4 个答案:

答案 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
}