swift中数组的唯一值

时间:2014-12-23 16:32:02

标签: ios swift

我正在使用swift构建iOS应用程序,我需要获取字符串数组的所有唯一值。

我一直在阅读苹果开发者文档,但它似乎没有它的功能。

有人能给我一个提示吗?

4 个答案:

答案 0 :(得分:129)

一种方法是使用集合:

let array = ["one", "one", "two", "two", "three", "three"]
let unique = Array(Set(array))
// ["one", "two", "three"]

您还可以创建一个更明确地过滤数组的扩展名:

extension Array where Element : Equatable {
    var unique: [Element] {
        var uniqueValues: [Element] = []
        forEach { item in
            if !uniqueValues.contains(item) {
                uniqueValues += [item]
            }
        }
        return uniqueValues
    }
}

注意

唯一数组将以未指定的顺序排列,您可能需要对其进行排序。有时通过枚举自己做得更好,你可以写一个扩展名。

进行扩展(Swift 2)可能会很好:

extension Array where Element : Hashable {
    var unique: [Element] {
        return Array(Set(self))
    }
}

可能有更多优化的方法可以做到你想要的,但这种方式既快捷又简单。

答案 1 :(得分:50)

在Swift标准库中没有这样做的功能,但你可以写一个:

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"]

这有一个缺点,就是要求序列的内容可以清除,而不仅仅是等同的,但是大多数等同的东西都是,包括字符串。

它还保留了原始顺序,例如,将内容放入字典或集合中,然后再将它们取回。

答案 2 :(得分:3)

我不知道内置的方式。这个通用函数可以做到这一点:

func distinct<S: SequenceType, E: Equatable where E==S.Generator.Element>(source: S) -> [E]
{
    var unique = [E]()

    for item in source
    {
        if !contains(unique, item)
        {
            unique.append(item)
        }
    }
    return unique
}

这方面的缺点是该解决方案在O(n 2 )中运行。

答案 3 :(得分:1)

使用var unique = [<yourtype>:Bool]()之类的字典,并在循环中填写unique[<array value>] = true之类的值。现在unique.keys已满足您的需求。