1 回答

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