Функция для проверки отсутствия пробелов в списке - PullRequest
4 голосов
/ 03 августа 2011

Мне просто нужна функция, которая возвращает true, если все элементы List[Integer] следуют друг за другом, т.е.

noGaps(List(3,4,5)) // true
noGaps(List(4,3,5)) // false
noGaps(List(3,4,6)) // false

У меня есть кое-что, что работает, но это немного многословно - какое самое элегантное решение?

Ответы [ 3 ]

12 голосов
/ 03 августа 2011

Как насчет этого?

def noGaps(xs: Seq[Int]) =
  xs.size < 2 || xs.sliding(2).forall { case Seq(x, y) => y == x + 1 }
0 голосов
/ 26 июля 2018

Можно явно указать, что вы сравниваете List с Range:

def noGaps(l: Seq[Int]): Boolean =
  l.isEmpty || l.sameElements(l.head to l.last)

Обратите внимание, что, хотя элегантно , это немного менее эффективно, чем скользящее решение , из-за l.last, который равен O(n). Если n - это размер списка и i первый элемент, для которого есть пробел (или n, если пробела нет), то скользящее решение будет выполнено с шагом i, тогда как этот выполняется n + i шагов.

0 голосов
/ 25 июля 2018
def noGaps(xs: Seq[Int]) = xs.isEmpty||xs.tail == xs.map(_+1).init
...