【问题标题】:Validate that sequence of numbers are within allowed range验证数字序列是否在允许的范围内
【发布时间】:2019-12-09 19:28:14
【问题描述】:

如何以更 scala/功能(不是 java 之类)的方式验证数字序列是否属于允许的数字范围?

val valuesRight = Seq(1, 2, 3, 4, 5, 6, 7)
val valuesWrong = Seq(1, 2, 5, 6, 7, 8, 9)
val allowedValues = Range(1, 8)

def containsNotAllowedValues(allowed: Range, input: Seq[Int]): Boolean = {
  var containsNotAllowedValue = false
  // pseudo code of how to do it in java, But how in scala / functional way?
  while next element is available
    validate if it is contained in allowed
    if not allowed set containsNotAllowedValue to true and break the loop early
  }
  containsNotAllowedValue
}

containsNotAllowedValues(allowedValues, valuesRight) // expected false as no wrong element contained
containsNotAllowedValues(allowedValues, valuesWrong) // expected true as at least single wrong element is contained

【问题讨论】:

  • 需要注意的是Range(1, 8)等价于(1 until 8)。即Range(1, 8).max == 7 如果您只需要允许范围的下限/上限,则Tuple(例如(1, 8))可能是一个更简单的选择,因为Range 用于更通用的构造函数Range(start: Int, end: Int, step: Int)
  • 没错。

标签: scala collections functional-programming


【解决方案1】:

您可以在Seq 上使用forall 函数。它检查给定谓词对于Seq 中的所有元素是否为真。如果该函数使用谓词 allowed contains _ 返回 false,则您的 Seq 包含非法值。

def containsNotAllowedValues(allowed: Range, input: Seq[Int]): Boolean = 
    !input.forall { allowed contains _ }

【讨论】:

  • 虽然这仅在all 数字匹配时才有效。有什么允许部分匹配的吗?
  • “部分匹配”是什么意思?您的意思是Seq 是否包含至少 1 个允许值?
  • 如果是这样,那么你可以做类似input.exists { allowed contains _ }
  • 如果它包含至少一个不允许的值,我的意思是相反的。
  • @GeorgHeiler 哦,现在我明白了。那是一个错误。它应该工作。我修正了我的答案。
【解决方案2】:

你可以做这样简单的事情:

def containsNotAllowedValues(allowed: Range, input: Seq[Int]): Boolean = {
  !(allowed.head <= input.min && allowed.last >= input.max)
}

val valuesRight = Seq(1, 2, 3, 4, 5, 6, 7)
val valuesWrong = Seq(1, 2, 5, 6, 7, 8, 9)
val allowedValues = Range(1, 8)

containsNotAllowedValues(allowedValues,valuesRight) //false
containsNotAllowedValues(allowedValues,valuesWrong) //true

如果 Range 只有 1 个值,例如 Range(1,1),这将失败 如果你愿意,你可以添加

allowed.size>1 

抓住那些案例

【讨论】:

  • 我认为你的结果被否定了。 containsNotAllowedValues(allowedValues,valuesRight) 应该返回 false。
  • 我喜欢这个,也支持部分匹配。连续值的前提条件适合我的用例。
  • 此解决方案将遍历input 两次。也许像input.exists(i =&gt; i &lt; allowed.min || i &gt; allowed.max + 1) 这样的东西会更有效。
  • 既然有Range.contains,为什么还要自己对索引进行数学运算?
  • 你们只是把事情复杂化了
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 2011-05-04
  • 2023-02-19
  • 2017-03-25
  • 2018-09-15
  • 2021-05-28
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多