Scala在Int列表中找到一个Int

时间:2014-09-25 09:17:20

标签: scala

我有一个Int,我需要在Int列表中找到此Int的上限和下限。

例如:

在List(1,3,6,9)中,当我要求2时,我应该得到1和3.我可以使用Scala集合API中的任何预构建函数吗?我知道我可以使用过滤器功能实现这一点,但我正在寻找已经存在的API(如果有的话)?

3 个答案:

答案 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))