后缀(来自:)和dropFirst(_:)之间是否有任何区别?

时间:2016-10-30 20:44:09

标签: swift swift3 subsequence

我刚刚想到在使用Swift中的子序列时,

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

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

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

相同

除了方便之外还有什么区别

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

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

3 个答案:

答案 0 :(得分:7)

他们完全不同。

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

然而,当谈到Array时,这些方法发生以表现相同(除了处理超出范围的输入)。

这是因为Array的{​​{1}}类型IndexInt开始,并按顺序计数到0,因此意味着一个子序列删除的第一个array.count - 1元素是从索引n开始的相同子序列

同样因为nArray,两种方法都会在O(1)时间内运行。

答案 1 :(得分: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 "[]"

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

同样使用prefix和dropLast。另一种思考方式,对于长度为n的序列,前缀(k)== dropLast(n-k),其中k <= n。

答案 2 :(得分:2)

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

所以dropFirst() FTW,如果您指定的元素多于可用的元素而不是崩溃,或者您不想要/需要检查以确保您使用的索引小于array.count

从概念上讲,我认为这对于命名的操作是有意义的,因为first是一个可选类型的属性,它返回第一个元素(如果它存在)。说dropFirst(3)表示&#34;删除可能存在的第一个元素(如果存在),并且这样做三次&#34;

相关问题