我正在寻找Kotlin / Java中最有效的方法来将Input_Frame
过滤掉一定的百分比,并且删除过滤后的元素将以统一的方式应用于整个集合(即-要删除的元素均匀地分布在整个集合中);
例如
Settings_Frame
过滤以下内容List
我想出了以下Kotlin扩展函数,当百分比<50%并且集合很大时,它很好用,但是当集合> 50%时,这种方法就失效了,因为它只处理整数除法。
[0,1,2,3,4,5,6,7,8,9] = [0,2,4,6,8]
有没有更好的方法,并且当百分比> 50%时也可以使用?
答案 0 :(得分:2)
我认为标准库中没有什么可以帮助您的,但是我想出了这种“手动”方法:
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必须使用并更新外部状态。)