按一定比例均匀过滤列表-Kotlin / Java

时间:2019-06-02 16:57:28

标签: java kotlin collections

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

例如

  • 通过50%Settings_Frame过滤以下内容
  • 通过10%List
  • 过滤以下内容

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

[0,1,2,3,4,5,6,7,8,9] = [0,2,4,6,8]

有没有更好的方法,并且当百分比> 50%时也可以使用?

1 个答案:

答案 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必须使用并更新外部状态。)