Swift中的数组唯一值

25 浏览
0 Comments

Swift中的数组唯一值

我正在使用Swift构建一个iOS应用程序,需要获取字符串数组的所有唯一值。\n我已经阅读了苹果开发者文档,但似乎没有提供相应的函数。\n有人能给我一个提示吗?

0
0 Comments

问题:如何在Swift中找到数组的唯一值?

原因:我不知道有没有内置的方法可以实现这个功能。

解决方法:可以使用以下通用函数来实现:

func distinct(source: S) -> [E] {

var unique = [E]()

for item in source {

if !contains(unique, item) {

unique.append(item)

}

}

return unique

}

这个解决方法的缺点是运行时间复杂度为O(n2)。因为`contains`函数的时间复杂度为O(n),所以整个解决方法的时间复杂度为平方级别。虽然这个解决方法不需要元素实现`Hashable`协议,但是速度较慢。

如果需要元素实现`Hashable`协议,可以使用下面的解决方法。这个解决方法的速度更快,但是要求元素实现`Hashable`协议。

extension Array {

func uniqueValues() -> [T] {

var set = Set()

var result = [T]()

for item in self {

if !set.contains(item as! T) {

set.insert(item as! T)

result.append(item as! T)

}

}

return result

}

}

可以通过重载函数来同时实现两种解决方法,编译器会自动选择最合适的解决方法。需要注意的是,两种解决方法的参数必须一致,否则会出现冲突。

let array = [1, 2, 2, 3, 4, 4, 5]

let uniqueValues = distinct(array)

let uniqueValues2 = array.uniqueValues()

以上是关于在Swift中找到数组的唯一值的问题的原因和解决方法。

0
0 Comments

问题:Swift标准库中没有提供数组去重的函数,但是可以自己编写一个。这个问题的解决方法是使用扩展对Sequence进行扩展,其中元素是可哈希的,然后通过过滤重复元素来实现数组去重。这种方法的缺点是要求序列的元素必须是可哈希的,而不仅仅是可比较的,不过大多数可比较的东西都是可哈希的,包括字符串。此外,这种方法保留了原始的顺序,不像将元素放入字典或集合中再取回来那样。

代码如下:

extension Sequence where Iterator.Element: Hashable {

func unique() -> [Iterator.Element] {

var seen: [Iterator.Element: Bool] = [:]

return self.filter { seen.updateValue(true, forKey: $0) == nil }

}

}

let a = ["four", "one", "two", "one", "three", "four", "four"]

a.unique() // ["four", "one", "two", "three"]

评论中提到了一些问题和改进方法:

1. 是否有错误?` Use of unresolved identifier 'seq'`

2. 是的,应该是`filter(source)`

3. 这在Swift 2中会报错,应该是`source.filter`

4. 在Swift 3中不起作用,你有什么想法吗?

5. 可以使用Set来代替字典作为seen的类型,代码如下:

var seen = Set()

return filter { seen.update(with: $0) == nil }

Swift标准库中没有提供数组去重的函数,但是可以通过自己编写一个扩展来实现。这种方法要求序列的元素必须是可哈希的,并且保留了原始的顺序。在实际使用中,可能会遇到一些问题,需要根据具体情况进行调整和改进。

0
0 Comments

问题的原因:

- 问题是要找到Swift中数组的唯一值。

- 问题可能出现的原因是没有提供Swift标准库中直接处理此问题的函数或方法。

解决方法:

- 解决方法一是使用扩展(extension)来实现。该扩展只适用于数组中的元素是可比较的(Equatable)。它创建了一个新的计算属性(unique),通过遍历数组并添加唯一值到一个新的数组中来实现。最后返回这个新的数组。这个方法在Swift 3中是有效的。

- 解决方法二是使用Swift标准库中的Set和Array类型的结合来实现。如果顺序不重要且元素也是可哈希的(hashable),可以使用Set来去重,然后再转换为数组。这个方法在Swift 4中仍然有效。

以下是一个示例,演示了如何使用这两种解决方法:

// 使用扩展方法

extension Array where Element: Equatable {

var unique: [Element] {

var uniqueValues: [Element] = []

forEach { item in

guard !uniqueValues.contains(item) else { return }

uniqueValues.append(item)

}

return uniqueValues

}

}

let array = ["one", "one", "two", "two", "three", "three"]

let unique = array.unique

print(unique) // ["one", "two", "three"]

// 使用Set和Array方法

let array2 = ["one", "one", "two", "two", "three", "three"]

let unique2 = Array(Set(array2))

print(unique2) // ["three", "one", "two"]

以上解决方法的有效性和效率也得到了评论的验证:

- 评论者对第一种解决方法表示赞赏,认为它简洁明了,并在Swift 3中有效。

- 另一个评论者指出,使用`Array(Set())`的方法在Swift 4中仍然有效,并表示这是一个很好的解决方法。

- 还有评论者提到了一个在Stack Overflow上找到的解决方法,并表示对这个Equatable版本的解决方法非常满意,因为不需要所有元素都是Hashable类型的。

- 评论中也有一些对解决方法的负面评价,比如使用Set可能导致顺序被打乱,第一种方法在大数据集上的性能不好,正确的方法是使用哈希表。

以上解决方法可以有效地找到Swift数组的唯一值,但需要根据具体的需求和数据集大小选择适合的解决方法。

0