检查可遍历是否在Scala中具有多于1个元素的有效方法

Lor*_*tté 6 scala scala-collections

我需要检查一下Traversable(我已经知道nonEmpty)是否有一个或多个元素.

我可以使用size,但(告诉我,如果我错了)我怀疑这可能是O(n),并遍历集合来计算它.

我可以查看是否tail.nonEmpty,或者是否.head != .last

这两种方法的优缺点是什么?有没有更好的办法?(例如,还会.last进行完整的迭代吗?)

Aiv*_*ean 9

从收集开始和返回尾部切割元素的所有方法都是低效的.例如,tail对于ListO(1),而tailfor Array是O(N).与...相同drop.

我建议使用take:

 list.take(2).size == 1 // list is singleton
Run Code Online (Sandbox Code Playgroud)

take如果集合长度小于take参数,则声明返回整个集合.因此,如果集合为空或只有一个元素,则不会出现错误.另一方面,如果收集量巨大,take则会在O(1)时间内运行.在内部take将开始迭代您的集合,采取两个步骤并中断,将元素放入新集合中以返回.

UPD:我改变了条件以完全匹配问题

  • 您可以避免使用`view(0,2).size`构建任何集合. (3认同)