Return 基于另一个列表的固定大小的列表

Return a fixed sized list based on an other list

我正在 Kotlin 中寻找一种方法,该方法 return 我从一个列表中找到一个新列表,该列表具有已定义的元素数量(例如 10)。 无论列表的大小如何,该方法总是 return 相同数量的元素。

例如,假设一个包含 3000 个元素的列表,它会 return 我是一个包含索引 0、300、600、900、1200 的 10 个元素的列表,...

这个有扩展功能吗?

这是一个想法:

利用方法 chunked(size: Int),它试图将给定的集合分成给定大小的 sub-collections。
这不是您想要的,但是您可以使用它来实现自定义扩展功能,该功能可以满足您的需求,例如像这样:

fun List<Int>.departInto(subListCount: Int) : List<List<Int>> {
    // calculate the chunk size based on the desired amount of sublists
    val chunkSize = this.size / subListCount
    // then apply that value to the chunked method and return the result
    return this.chunked(chunkSize)
}

使用它可能如下所示:

fun main() {
    // define some example list (of 30 elements in this case)
    val someList: List<Int> = List(30, {it})
    // use the extension function 
    val tenSubLists = someList.departInto(10)
    // print the result(s)
    println(tenSubLists)
}

此代码的输出将是 3 个元素中的 10 sub-lists 个(您的 3000 个元素示例将导致每个 300 个元素中的 10 sub-lists 个):

[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29]]

这是一种专门的东西,所以标准库中没有任何东西(据我所知)- 但您可以轻松地制作自己的扩展函数:

fun <T: Any> List<T>.sample2(count: Int): List<T> {
    // this allows for a fractional step, so we get a more accurate distribution of indices 
    // with smaller lists (where count doesn't divide into the list size evenly)
    val step = size / count.toFloat()
    return List(count) { i -> elementAt((i * step).toInt()) }
}

如果您的列表太小而无法提供 count 唯一索引(例如,您的列表有 9 个项目,而您想要 10 个),您将得到重复,所以如果您想要不同的,则必须处理这个问题行为,但我认为这是最简单的方法