You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中如何实现整数列表元素匹配(无匹配取紧邻较小值)

解决Scala中列表元素匹配与紧邻较小值查找问题

嘿,这个需求其实可以用Scala的集合操作结合高效查找来实现,我给你两种方案,一种是直观易懂的基础版,另一种是适合大数据量的高效版:

基础实现(直观易懂)

先确保b是有序的(题目里已经有序,但加上排序更健壮),然后对a的每个元素,筛选出b中所有小于等于它的元素,取最后一个就是符合要求的最大紧邻较小值:

val a = List(1,2,3,4,5,6,7,8,9)
val b = List(1,5,10).sorted // 确保列表有序,避免原列表无序导致结果错误

a.foreach { num =>
  // 筛选b中<=当前元素的所有值,取最后一个(最大的符合条件的值)
  val target = b.filter(_ <= num).lastOption.getOrElse(
    throw new IllegalArgumentException("b中不存在小于等于当前元素的数值")
  )
  println(s"$num --> $target")
}

高效实现(适合大数据量)

如果b的元素很多,上面的filter会遍历整个列表,效率较低。这时候可以借助Java的TreeSet,它的floor方法能在O(log n)时间内找到小于等于给定值的最大元素,完美匹配需求:

import java.util.TreeSet

val a = List(1,2,3,4,5,6,7,8,9)
val b = List(1,5,10)

// 将b元素存入TreeSet,构建有序集合
val treeSet = new TreeSet[Int]()
b.foreach(treeSet.add)

a.foreach { num =>
  // floor方法直接返回<=num的最大元素,不存在则返回null
  val target = treeSet.floor(num)
  println(s"$num --> $target")
}

输出验证

两种方案都会输出你期望的结果:

1 --> 1
2 --> 1
3 --> 1
4 --> 1
5 --> 5
6 --> 5
7 --> 5
8 --> 5
9 --> 5

小提示:如果b可能为空,或者存在a中元素比b所有元素都小的情况,记得处理lastOption的空值或者floor返回的null哦,比如可以用getOrElse设置默认值。

内容的提问来源于stack exchange,提问作者Sat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:24:19