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 个),您将得到重复,所以如果您想要不同的,则必须处理这个问题行为,但我认为这是最简单的方法
我正在 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 个),您将得到重复,所以如果您想要不同的,则必须处理这个问题行为,但我认为这是最简单的方法