gpt4 book ai didi

java - 按一定百分比均匀过滤列表 - Kotlin/Java

转载 作者:行者123 更新时间:2023-11-30 01:49:58 24 4
gpt4 key购买 nike

我正在 Kotlin/Java 中寻找一种最有效的方法来过滤 List下降一定的百分比,并且删除过滤的元素将以统一的方式应用于整个集合(即要删除的元素均匀地分布在整个集合中);

例如

  • 将以下内容过滤 50% [0,1,2,3,4,5,6,7,8,9] = [0,2,4,6,8]
  • 按 10% 过滤以下内容 [1,100,1000,10000] = [1,100,10000]

我想出了以下 Kotlin 扩展函数,当百分比 < 50% 并且集合很大时,它效果很好,但当集合 > 50% 时,这种方法就会失败,因为它只处理整数除法。

private fun <E> List<E>.filterDownBy(perc: Int): List<E> {
val distro = this.size / ((perc * this.size) / 100)
if (perc == 0 || distro >= this.size)
return this
return this.filterIndexed { index, _ -> (index % distro) != 0 }

有没有更好的方法来做到这一点并且在百分比 > 50% 时也能起作用?

最佳答案

我认为标准库中没有太多帮助,但我想出了这种“手动”方法:

fun <T> List<T>.takeProportion(prop: Double): List<T> {
if (prop < 0 || prop > 1)
throw IllegalArgumentException("prop ($prop) must be between 0 and 1")
val result = ArrayList<T>()
var tally = 0.5
for (i in this) {
tally += prop
if (tally >= 1.0) {
result += i
tally -= 1
}
}
return result
}

它使用一种误差扩散方法来确保在列表中均匀地获取值,并使用浮点,以便它可以顺利地处理从 0.0(给出一个空列表)到 1.0(取每个值)之间的任何比例。元素)。

(可能有一种仅使用整数算术来完成此操作的方法,但使用浮点可能更易于编码和理解。)

(您可能可以通过使用 filter() 使其更具功能性,但这并不合适,因为 lambda 必须使用并更新外部状态。)

关于java - 按一定百分比均匀过滤列表 - Kotlin/Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56417097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com