如何获得符合“序列”的类型的计数?

时间:2015-02-26 21:06:34

标签: swift count sequence

我们说我有这段代码:

func work<S: Sequence>(sequence: S) {
    // do stuff
}

我如何计算sequence中有多少元素?
我所采用的明显版本效率很低:

var count = 0
for element in sequence {
    count += 1
}

必须有更好的方式,对吧?

2 个答案:

答案 0 :(得分:7)

我认为没有更好的方法可以满足任意类型 SequenceType。关于序列唯一知道的是 有一个generate()方法返回GeneratorType,反过来 有一个next()方法。 next()方法进入下一个方法 序列的元素并返回它,如果存在则返回nil 没有下一个元素。

请注意,next()最终不会返回 nil:序列可能包含“无限”元素。

因此,枚举序列是计算序列的唯一方法 元素。但这不需要终止。因此答案可以 也是:一个接受序列参数的函数不应该知道 元素总数。

对于符合CollectionType的类型,您可以使用 countElements()函数(在Swift 1.2中重命名为count())。

还有underestimateCount()

/// Return an underestimate of the number of elements in the given
/// sequence, without consuming the sequence.  For Sequences that are
/// actually Collections, this will return countElements(x)
func underestimateCount<T : SequenceType>(x: T) -> Int

但这并不一定会返回确切的元素数。

答案 1 :(得分:2)

更“实用”的方法是:

akka 2.3.12

甚至进行扩展:

let count = sequence.reduce(0) { acc, row in acc + 1 }

注意,这仍然存在基本的序列问题,即您必须消耗序列才能对其进行计数。