首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查集合中包含的所有元组中的给定整数元素是否按连续顺序排列

检查集合中包含的所有元组中的给定整数元素是否按连续顺序排列
EN

Stack Overflow用户
提问于 2019-06-20 19:39:46
回答 2查看 54关注 0票数 2

有了一个元组集合,我想检查所有元组中给定的整数元素是否具有连续顺序的值。为简单起见,可以假设元组按该元素按升序排序。

例如,考虑到此数组中所有元组的第一个元素应返回false (4,8,9,10,13):

代码语言:javascript
复制
val a = List((4,2), (8,1), (9,4), (10,2), (13,1))

考虑到这个数组中所有元组的第一个元素应该返回true (8,9,10,11,12):

代码语言:javascript
复制
val b = List((8,2), (9,1), (10,4), (11,2), (12,1))

使用List作为具有模式匹配的集合,我可以使用模式匹配进行检查,如下所示:

代码语言:javascript
复制
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
  }

有没有更简单的方法来完成这件事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-20 20:36:48

下面是您可以尝试使用sliding的内容

代码语言:javascript
复制
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

或者你也可以尝试这个定义:

代码语言:javascript
复制
def consecutive(s: Seq[(Int, Int)]): Boolean = 
   if (s.isEmpty) true
   else (s zip s.tail) forall { case ((x,_), (y,_)) => x + 1 == y} 
票数 2
EN

Stack Overflow用户

发布于 2019-06-21 03:00:45

这是一个使用foldLeft的解决方案

代码语言:javascript
复制
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
  }
}

哪种输出

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56685176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档