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
相关产品推荐
相关产品推荐

