1 回答
TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
我認(rèn)為標(biāo)準(zhǔn)庫中沒有多少有用的東西,但我想出了這種“手動(dòng)”方法:
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
}
它使用一種錯(cuò)誤擴(kuò)散的方式來確保值在列表中均勻地取值,并使用浮點(diǎn)數(shù)以便它平滑地處理從 0.0(給出一個(gè)空列表)到 1.0(取每個(gè)元素)的任何比例。
(可能有一種方法只使用整數(shù)運(yùn)算來完成它,但使用浮點(diǎn)數(shù)可能更容易編碼和理解。)
(您可能可以通過使用 使它看起來更實(shí)用filter(),但這并不合適,因?yàn)?lambda 必須使用和更新外部狀態(tài)。)
添加回答
舉報(bào)
