7

我突然想到,在 Swift 中处理子序列时,

func suffix(from: Int)似乎与 just 相同dropFirst(_:)(显然,在长度为“10”的数组的情况下,您只需将输入值从“3”更改为“7”。)

只是重复一遍。所以:当然,对于长度为 10 的数组。例如,我的意思是"2"与 "8"func suffix(from: Int)相同dropFirst(_:)

同样upTo/through似乎与dropLast(_:)

除了方便,还有什么区别吗?

(也许在错误条件、性能或?)

我想知道,事实上,在 Swift 内部,一个或另一个是否只是通过调用另一个来实现的?

4

3 回答 3

8

它们完全不同。

*与所有协议要求记录的时间复杂度一样,符合类型的实现可能具有较低的时间复杂度。例如,aRandomAccessCollectiondropFirst(_:)方法将在 O(1) 时间内运行。


但是,当涉及到 时Array,这些方法恰好表现相同(处理超出范围的输入除外)。

这是因为 Array具有从 开始并按顺序计数到Index的类型,因此意味着删除第一个元素的子序列与从索引开始的子序列相同Int0array.count - 1nn

也因为Array是 a RandomAccessCollection,这两种方法都将在 O(1) 时间内运行。

于 2016-11-02T22:54:03.090 回答
2

你是对的,它们是相互关联的,但是是的,它们是有区别的。从文档:

let numbers = [1, 2, 3, 4, 5]
print(numbers.suffix(2))
// Prints "[4, 5]"
print(numbers.suffix(10))
// Prints "[1, 2, 3, 4, 5]"

相对

let numbers = [1, 2, 3, 4, 5]
print(numbers.dropFirst(2))
// Prints "[3, 4, 5]"
print(numbers.dropFirst(10))
// Prints "[]"

在第一个示例中,suffix(2)仅返回最后两个元素,而 dropFirst(2) 返回除前两个元素之外的所有元素。同样,它们的行为也不同。比序列长的参数很长。(此外,后缀仅适用于有限序列。)

前缀和 dropLast 也是如此。另一种思考方式,对于长度为 n 的序列,prefix(k) == dropLast(nk),其中 k <= n。

于 2016-10-30T21:00:26.217 回答
2

IMO 最大的区别是它dropFirst()不会将您的代码暴露给超出范围的索引错误。因此,您可以安全地dropFirst在空数组上使用任何一种形式,而prefix/suffix方法可能会在空数组或超出范围的参数上崩溃。

因此dropFirst(),如果您在指定的元素多于可用元素而不是崩溃时更喜欢空数组结果,或者如果您不想/需要检查以确保您将使用的索引小于array.count, ETC。

从概念上讲,我认为这对于命名的操作是有意义的,考虑到这是一个可选类型的属性,如果它存在则first返回第一个元素。说的意思是“删除可能存在的第一个元素,如果它存在,并且这样做三遍”dropFirst(3)

于 2016-11-02T21:15:27.840 回答