【问题标题】:List filter within the outer range - KOTLIN外部范围内的列表过滤器 - KOTLIN
【发布时间】:2017-10-25 04:32:51
【问题描述】:

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

将输出作为空列表。

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

【问题讨论】:

    标签: list filter kotlin


    【解决方案1】:

    4..2 基本上是一个空范围,因为它转换为it &gt;= 4 &amp;&amp; it &lt;= 2。要创建递减范围,您必须使用downTo

    args.filter { it in 4 downTo 2 }
    

    reversed 在某些情况下也可以作为替代方案:

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

    这个具体问题也是 Dan Lew 最近的blog post 中第一个很好地涵盖范围的示例。

    【讨论】:

    • 黄金!!谢谢老兄。
    【解决方案2】:

    使用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
    }
    

    【讨论】:

      【解决方案3】:

      您好,您需要使用运算符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

      【讨论】:

      • 认为我需要深入研究 kotlinDocs,谢谢顺便说一句:)
      【解决方案4】:

      除了这些答案,我还发现! 操作也很有效

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

      【讨论】:

      • 这只是返回原始列表(嗯,它的副本),因为在4..2 范围内不能有任何值,因此这个过滤条件始终为真。 (或者换句话说,it !in 4..2 对任何it 值都是正确的,因为4..2 中没有任何内容)。另外,您在这里使用的运算符实际上是!in
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2018-04-07
      • 2016-06-23
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多