2017-06-13 67 views
1

我刚开始学习kotlin,而我偶然发现了这个小问题。我有一个对象列表,并在指定的范围内筛选列表。我能够在范围内获得的对象,但是当我改变了范围外束缚,我得到一个空数组,在外部范围内的列表过滤器 - KOTLIN

所以保持这个问题简单,可以说我有像

整数列表
original list [1, 2, 3, 4, 5, 6, 7] 

和时遇到一个滴管功能,过滤掉的元素

工作状态

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 
} 

获得输出为空列表。

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

回答

1

除了这些问题的答案,我还发现,!操作工程,以及

fun dropper(args: ArrayList<Int>): List<Int> { 
    return args.filter { it !in 2..4 } // it <= 2 && it >= 4 
} 
+0

这只是返回原始列表(以及它的副本),因为没有值可以在'4..2'范围内,因此这个过滤器条件总是如此。 (或者换句话说,'4!2'中的it!对于任何'it'值都是正确的,因为'4..2'中没有任何内容)。另外,您在这里使用的操作符实际上是['!in'](https://kotlinlang.org/docs/reference/operator-overloading.html#in)。 – zsmb13

3

4..2基本上是一个空的范围,因为它转换为it >= 4 && it <= 2。打造了递减的范围,你必须使用downTo

args.filter { it in 4 downTo 2 } 

reversed也可以在某些情况下,一种替代方案:

args.filter { it in (2..4).reversed() } 

这一特定问题也是丹卢最近blog post第一个例子很好地覆盖范围。

+0

黄金!谢了哥们。 – Sanoop

1

使用downTo。详细说明请参阅Ranges

范围(x..y),这里x是起始索引,y是最后一个,它是递增方式。所以1..10范围有10个元素,但10..1从10个向前看,所以它是一个空的范围。您需要使用downTo运算符。

更改您的代码像下面:

fun dropper(args: ArrayList<Int>): List<Int> { 
    return args.filter { it in 4 downTo 2 } // it <= 2 && it >= 4 
} 
1

您好,您需要使用运营商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://kotlinlang.org/docs/reference/ranges.html#ranges

+0

认为我需要深入挖掘kotlinDocs,谢谢BTW :) – Sanoop