在 Kotlin 中获取最后 n 个元素

问题描述 投票:0回答:4

我有一个列表,我想对其应用一些转换,但不包括前 2 个元素。我怎样才能以最好的方式做到这一点?像这样的东西:

list.reversed().take(list.size - 2)...(my transformations)

list.excludeFirstN(2)...(my transformations)
functional-programming kotlin
4个回答
24
投票

您可以使用takeLast(n),例如:

list.takeLast(3)

但是要小心,最后一个数字首先表示,所以你可能还需要使用reversed,所以你的代码可能是:

list.takeLast(3).reversed()

10
投票

哦,我找到了 drop() 函数。


4
投票

正如已经提到的,

drop
非常适合该用例:

listOf(1,2,3,4).drop(2).forEach(::println)

否则,您也可以按索引过滤:

listOf(1,2,3,4).filterIndexed { index, _ -> index > 1 }.forEach(::println)

0
投票

有多种方法可以做到这一点:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.