在Kotlin/Java中将列表过滤到一定大小
我正在Kotlin/Java中寻找一种最有效的方法,将在Kotlin/Java中将列表过滤到一定大小,java,kotlin,collections,Java,Kotlin,Collections,我正在Kotlin/Java中寻找一种最有效的方法,将列表向下过滤一定数量,并以统一的方式在整个集合中应用已过滤元素的移除(即,要移除的元素均匀地跨越整个集合) 比如说 将下列内容过滤到5[0,1,2,3,4,5,6,7,8,9]=[0,2,4,6,8] 将以下内容过滤到2[1100100010000]=[11000] 我提出了以下Kotlin扩展函数,但它没有按预期工作(其返回值超过请求的计数-例如初始大小=2593,newcount=125-list=130) fun List.filt
列表向下过滤一定数量,并以统一的方式在整个集合中应用已过滤元素的移除(即,要移除的元素均匀地跨越整个集合)
比如说
- 将下列内容过滤到5[0,1,2,3,4,5,6,7,8,9]=[0,2,4,6,8]
- 将以下内容过滤到2[1100100010000]=[11000]
我提出了以下Kotlin扩展函数,但它没有按预期工作(其返回值超过请求的计数-例如初始大小=2593,newcount=125-list=130)
fun List.filterDownByToCount(newCount:Int):List{
if(newCount<0 | | newCount>=此.size)
抛出IllegalArgumentException(“prop($newCount)必须介于1和$newCount之间”)
val比率=大小/新计数
val list=this.filterIndexed{index,->index%比率==0}
返回列表
}
理想情况下,此函数可以处理从0
到list.size-1
&我希望使用库来实现这一点(如果可能的话),但似乎找不到任何适合我的用例 问题是size/newCount
是比率的下限,因此比率太小,因此得到的元素比预期的多
改用天花板:
val ratio = (size + newCount - 1) / newCount
例如,这将导致一个大小为124的列表。问题在于大小/newCount
是比率的下限,因此比率太小,因此您得到的元素比预期的多
改用天花板:
val ratio = (size + newCount - 1) / newCount
例如,这将导致一个大小为124的列表。问题是比率实际上是一个小数,但您正在进行整数运算
fun <T> List<T>.filterDownByToCount(newCount: Int): List<T> {
if (newCount < 0 || newCount >= this.size)
throw IllegalArgumentException("prop ($newCount) must be between 1 and $newCount")
val ratio = size.toDouble() / newCount
var accu = 0.0
val list = this.filter { _ ->
(accu <= 0).also { if (accu <= 0) accu += ratio; accu-- }
}
return list
}
fun List.filterDownByToCount(newCount:Int):List{
if(newCount<0 | | newCount>=此.size)
抛出IllegalArgumentException(“prop($newCount)必须介于1和$newCount之间”)
val ratio=size.toDouble()/newCount
var accu=0.0
val list=this.filter{{{u->
(accu问题是比率实际上是一个分数,但你在做整数运算
fun <T> List<T>.filterDownByToCount(newCount: Int): List<T> {
if (newCount < 0 || newCount >= this.size)
throw IllegalArgumentException("prop ($newCount) must be between 1 and $newCount")
val ratio = size.toDouble() / newCount
var accu = 0.0
val list = this.filter { _ ->
(accu <= 0).also { if (accu <= 0) accu += ratio; accu-- }
}
return list
}
fun List.filterDownByToCount(newCount:Int):List{
if(newCount<0 | | newCount>=此.size)
抛出IllegalArgumentException(“prop($newCount)必须介于1和$newCount之间”)
val ratio=size.toDouble()/newCount
var accu=0.0
val list=this.filter{{{u->
(累积可能的副本)