Filtro de list dentro del range externo – KOTLIN

Acabo de empezar a aprender kotlin, y me encontré con este pequeño problema. Tengo una list de Objetos y estoy filtrando la list dentro de un range específico. Soy capaz de get los objects dentro del range, pero cuando cambié el range al límite externo, obtengo una matriz vacía,

Para mantener la pregunta simple, digamos que estoy teniendo una list de integers como

original list [1, 2, 3, 4, 5, 6, 7] 

y estoy teniendo una function de countgotas, que filtra los elementos

condiciones de trabajo

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

la salida se recibe como

  [2, 3, 4, 5, 6] 

pero cuando cambio el range a

 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 } 

obteniendo salida como una list vacía.

Estoy casi seguro de que el valor de la list no se está borrando, porque después de llamar a esta function paso la list a otra operación que da el resultado deseado.

4..2 es básicamente un range vacío, porque se traduce a it >= 4 && it <= 2 . Para crear un range decreciente, debe usar downTo :

 args.filter { it in 4 downTo 2 } 

reversed también puede ser una alternativa en algunos casos:

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

Este problema específico también es el primer ejemplo en la publicación de blog reciente de Dan Lew que cubre ranges muy bien.

Use downTo . leer Rangos para una descripción detallada.

Rango ( x..y ), aquí x es índice inicial e y es último y va de manera incremental. Entonces, el range 1..10 tiene 10 elementos, pero 10..1 ve de 10 en 10..1 por lo que es un range vacío. Necesita usar el operador downTo .

Cambie su código de la siguiente manera:

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

Hola, necesitas usar el operador 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] } 

Aquí se describe completamente cómo usar ranges. – https://kotlinlang.org/docs/reference/ranges.html#ranges

Además de estas respuestas, ¡también descubrí eso ! la operación también funciona

 fun dropper(args: ArrayList<Int>): List<Int> { return args.filter { it !in 2..4 } // it <= 2 && it >= 4 } 
  • Android Spinner getDropDownView repite elementos después de la selección
  • Obtener los elementos de una list de lists con la API de transmisión de Java en Kotlin
  • En Kotlin, ¿cómo se modifican los contenidos de una list mientras se itera
  • ¿Cómo crear una list inmutable en Kotlin que también sea una list inmutable en Java?