我有一个Int,我需要在Int列表中找到此Int的上限和下限。
例如:
在List(1,3,6,9)中,当我要求2时,我应该得到1和3.我可以使用Scala集合API中的任何预构建函数吗?我知道我可以使用过滤器功能实现这一点,但我正在寻找已经存在的API(如果有的话)?
答案 0 :(得分:1)
所以,不是内置的,但是你走了。由于你想要(例如)0和10没有返回,我们需要返回一个选项。
var rs = List(1, 3, 6, 9) //> rs : List[Int] = List(1, 3, 6, 9)
def bracket(n: Int, rs: List[Int]) = {
val (l, r) = rs.span(_ < n)
if (l == Nil || r == Nil)
None
else if (r.head == n)
Some((n, n))
else
Some((l.last, r.head))
}
bracket(0, rs) //> res0: Option[(Int, Int)] = None
bracket(2, rs) //> res1: Option[(Int, Int)] = Some((1,3))
bracket(6, rs) //> res2: Option[(Int, Int)] = Some((6,6))
bracket(10, rs) //> res3: Option[(Int, Int)] = None
如果您知道边缘情况不会发生,则替代:
def bracket(n: Int, rs: List[Int]) = {
val (l, r) = rs.span(_ < n)
if (r.head == n)
(n, n)
else
(l.last, r.head)
}
bracket(2, rs) //> res0: (Int, Int) = (1,3)
bracket(6, rs) //> res1: (Int, Int) = (6,6)
(如果n没有下限和上限,将抛出异常)
如果你没有边缘情况而且你可以使用(&lt; =,&gt;)元组,那么只需
def bracket(n: Int, rs: List[Int]) = {
val (l, r) = rs.span(_ <= n)
(l.last, r.head)
}
bracket(2, rs) //> res0: (Int, Int) = (1,3)
bracket(6, rs) //> res1: (Int, Int) = (6,9)
答案 1 :(得分:0)
作为一种变通方法,您还可以将List转换为NavigableSet(具有更高和更低方法的Java类,这些方法或多或少地执行您所需的操作)。
答案 2 :(得分:0)
您可以使用分组或幻灯片迭代器一次获取2个元素并测试条件:
// you can also add 'numbers.sorted' if your list is not sorted
def findBoundries(x: Int, numbers: List[Int]): Option[List[Int]] =
numbers.grouped(2).find {
case a :: b :: Nil => a <= x && x <= b
}
findBoundries(2,List(1,3,6,9))