2017-06-13 28 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