Проверка, находится ли данный целочисленный элемент во всех кортежах, содержащихся в коллекции, в последовательном порядке - PullRequest
2 голосов
/ 20 июня 2019

Имея коллекцию кортежей, я хотел бы проверить, имеет ли данный целочисленный элемент во всех кортежах значения в последовательном порядке.Для простоты можно предположить, что кортежи отсортированы в порядке возрастания по этому элементу.

Например, при рассмотрении первого элемента всех кортежей в этом массиве должно возвращаться false (4, 8, 9, 10,13):

val a = List((4,2), (8,1), (9,4), (10,2), (13,1))

При рассмотрении первого элемента из всех кортежей в этом массиве должно возвращаться true (8, 9, 10, 11, 12):

val b = List((8,2), (9,1), (10,4), (11,2), (12,1))

Используя List как коллекцию с сопоставлением с образцом, я могу выполнить проверку, используя сопоставление с образцом, как показано ниже:

def consecutive(l: List[(Int, Int)], last: Option[Int] = Option.empty): Boolean =
  l match {
    case h :: t => {
      if (last.isEmpty || (last.isDefined && h._1 == last.get + 1))
        consecutive(t, Option(h._1))
      else false
    }
    case Nil => true
  }

Есть ли более простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Вот решение, использующее foldLeft

def consecutive(list: List[(Int, Int)]): Boolean = {
  list.map(_._1) match {
    case first :: second :: tail =>
      val (_, isConsecutive) =
        (second :: tail).foldLeft((first, true)) { case ((previous, previousWasConsecutive), next) =>
          (next, next - previous == 1 && previousWasConsecutive)
        }
      isConsecutive

    case _ => true
  }
}

, которое выводит

consecutive(Nil)                                        // res0: Boolean = true
consecutive(List((1,2)))                                // res1: Boolean = true
consecutive(List((4,2), (8,1), (9,4), (10,2), (13,1)))  // res2: Boolean = false
consecutive(List((8,2), (9,1), (10,4), (11,2), (12,1))) // res3: Boolean = true
2 голосов
/ 20 июня 2019

Вот что вы можете попробовать, используя sliding:

def consecutive(s: Seq[(Int, Int)]): Boolean = s match {
      case Seq() => true
      case Seq(_) => true
      case _ => s.sliding(2).forall { case Seq((x, _), (y, _)) =>  x + 1 == y }
  }

scala>consecutive(b)
res5: Boolean = true

consecutive(a)
res7: Boolean = false

или вы также можете попробовать это определение:

def consecutive(s: Seq[(Int, Int)]): Boolean = 
   if (s.isEmpty) true
   else (s zip s.tail) forall { case ((x,_), (y,_)) => x + 1 == y} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...