Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Kotlin/Java中将列表过滤到一定大小_Java_Kotlin_Collections - Fatal编程技术网

在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

我正在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.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->
(累积可能的副本)