查找集合中最接近的值但不超过它

And*_*Dev 3 kotlin

我有一个集合,想要返回最接近某个固定值但不超过固定值的值。例如,如果我的集合如下所示:

val numbers = mutableListOf(23, 12, 64, 47, 36, 55)
Run Code Online (Sandbox Code Playgroud)

我的目标固定值为 35,从集合返回的值将为 23。以下是其他一些示例:

Target -> Returned
29 -> 23
5 -> null (there is no value less than 12, so null is returned)
70 -> 64
Run Code Online (Sandbox Code Playgroud)

我可以使用一些 Collection 函数来提供预期的结果吗?注意:数字列表未排序。在真正的应用程序中,这些不是数字,而是包含整数属性的对象,但如果这有助于解决方案,我也可以首先根据该值对集合进行排序。

sid*_*ate 5

您可以使用fold函数将最接近的值保存在累加器中。例如,

val numbers = mutableListOf(23, 12, 64, 47, 36, 55)

val target = 35

val answer = numbers.fold(null){acc: Int?, num ->
    if(num <= target && (acc == null || num > acc)) num
    else acc
}
Run Code Online (Sandbox Code Playgroud)

如果您想在目标与列表中的值之一匹配时中断循环,您可以使用以下命令

val numbers = mutableListOf(23, 12, 64, 47, 36, 55)
val target = 35

fun MutableList<Int>.findClosest(input: Int) = fold(null) { acc: Int?, num ->
    val closest = if (num <= input && (acc == null || num > acc)) num else acc
    if (closest == input) return@findClosest closest else return@fold closest
}

val answer = numbers.findClosest(target)
Run Code Online (Sandbox Code Playgroud)

一旦目标匹配特定值,return内部函数中的关键字就会从函数返回findClosest