我有一个列表,我想对其应用一些转换,但不包括前 2 个元素。我怎样才能以最好的方式做到这一点?像这样的东西:
list.reversed().take(list.size - 2)...(my transformations)
或
list.excludeFirstN(2)...(my transformations)
您可以使用takeLast(n),例如:
list.takeLast(3)
但是要小心,最后一个数字首先表示,所以你可能还需要使用reversed,所以你的代码可能是:
list.takeLast(3).reversed()
哦,我找到了 drop() 函数。
正如已经提到的,
drop
非常适合该用例:
listOf(1,2,3,4).drop(2).forEach(::println)
否则,您也可以按索引过滤:
listOf(1,2,3,4).filterIndexed { index, _ -> index > 1 }.forEach(::println)
有多种方法可以做到这一点:
1。通过 kotlin 集合 (subList) :🧡
val numbers = listOf(1, 2, 3, 4, 5)
val lastThree = numbers.subList(numbers.size - 3, numbers.size)
// flexible and no need to reverse result
2。通过 kotlin 集合 (takeLast) :
val numbers = listOf(1, 2, 3, 4, 5)
val lastThree = numbers.takeLast(3).reversed()
3。通过流(跳过):
fun getLastNItems(list: List<Int>, n: Int): List<Int> {
return list.stream()
.skip(list.size - n)
.limit(n) // truncated to be no longer than n
.collect(Collectors.toList())
}
4。通过流(takeWhile/reverse):
fun getLastNItems(list: List<Int>, n: Int): List<Int> {
return list.stream()
.takeWhile { it -> list.indexOf(it) < n }
.reverse()
.collect(Collectors.toList())
}
5。通过手动制作子列表:
fun getLastNItems(list: List<Any>, n: Int): List<Any> {
if (n > list.size)
throw IllegalArgumentException("n cannot be greater than the size of the list")
val subList = mutableListOf<Any>()
for (i in list.size - n until list.size)
subList.add(list[i])
return subList
}