如何知道List是否是同质的

时间:2014-09-28 19:03:51

标签: scala collections type-safety

我想知道List是否是同质的。

这是我的代码:

def isHomogeneous(ls: List[Any]) = ls.map(_.getClass).toSet.size == 1

有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

def allEqual(xs: Traversable[_]) =
  xs.headOption.forall(head => xs.forall(_ == head))

def isHomogeneous(xs: Traversable[_]) =
  allEqual(xs.view.map(_.getClass))
  • getClass商家与遍历分开。
  • 使用更多常规类型Traversable而非List
  • 适用于Nil
  • 除非必要,否则不会遍历整个集合。

答案 1 :(得分:1)

怎么样

def isHomogeneous(l: List[Any]) = {
  val t = l(0).getClass
  l.forall(_.getClass == t)
}

因此,如果所有元素都与第一个元素具有相同的类型,则返回true

编辑:为了扩展我认为这个解决方案更好的原因:

  • 只会在列表中循环一次
  • 它可以提前退出(如果第二个元素属于不同的类,它可以立即退出而不是尝试其他元素)
  • 它不会创建中间对象
  • 它不需要实现hashCode方法(根据Set的实现,它可以使用)
  • 看起来,至少对我来说,更清楚