【问题标题】:How to check if list contains all the same values?如何检查列表是否包含所有相同的值?
【发布时间】:2017-01-05 05:53:52
【问题描述】:

我有一个List[<DataType>] 作为输入。我想检查列表是否包含所有相同的值(不是数据类型)。

Scala 中是否有内置方法或直观方式来执行此操作,而不是遍历列表和检查。

【问题讨论】:

  • "而不是遍历列表" 任何解决方案都必须遍历列表(至少在找到不同的元素之前)
  • 好的,好点。我更多地考虑的是 Scala 是否有一些更优化的构造,然后用户迭代列表。
  • 所有相同的数据type,意思是DataType是一个trait/abstract类?
  • @YuvalItzchakov 不,他们是一流的。存在于 org.apache.spark.sql.types
  • 现在你把事情搞糊涂了。你说过你有@jwh 的答案,但那是关于价值观的,在你的评论和问题的正文中,你说你想匹配类型。但是在你的主题中,你说的是价值观。您能否举例说明您要检查的内容和预期的输出?

标签: scala list apache-spark


【解决方案1】:

这将在第一个不等于元素处终止。元素类型必须支持比较器,如==!=

lst.forall(_ == lst.head)  // true  if empty or all the same
lst.exists(_ != lst.head)  // false if empty or all the same

【讨论】:

  • return (lst.toSet.size >1) 这与您的第二个代码复杂度相比如何?
  • 它很简洁,但我不认为它更有效率。对于统一的(所有值都相等)的集合,它可能稍微好一点,但如果集合不统一,那肯定会更糟,因为 A)它不会提前终止,并且 B)每个元素都会运行进入Set 必须与Set 中已经存在的每个元素进行比较。如果前 2 个元素不相等,则后面的每个元素都将与 Set 中已有的 both 元素进行比较。 (顺便说一句,return 语句在惯用的 Scala 中很少见。)
  • 好的。谢谢你提供的详情。是的,我知道退货,我把它放在那里,这样人们就可以理解我在问什么。
【解决方案2】:

一种(低效但优雅)的方式是

List(1, 2, 2, 1, 1).distinct.length == 1 // returns false
List(1, 1, 1, 1, 1).distinct.length == 1 // returns true
List().distinct.length == 1 // empty list returns false

注意它们必须是同一类型

List(4, 4.0, "4").distinct.length == 1 // returns false

【讨论】:

  • 这真的效率低下
【解决方案3】:

我只是为了一个不相关的问题才这样做,所以要稍微改进一下上面的内容:lst.tail.forall(_ == lst.head)。这避免了检查列表的头部是否等于它自己,你已经知道这是真的。

【讨论】:

  • 如果你在一个空的 Seq 上尝试它会抛出,而@jwvh 的答案将返回 true。
  • lst.drop(1).forall(_ == lst.head) 呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多