Уникальные значения массива в быстрых - программирование

Уникальные значения массива в быстрых

Я создаю приложение iOS со скоростью, и мне нужно получить все уникальные значения массива строк.

Я читал документы разработчиков Apple, но у него, похоже, нет функции.

Может кто-нибудь подскажет мне?

4b9b3361

Ответ 1

Один из способов - использовать набор:

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))
    }
}

Есть, вероятно, более оптимизированные способы делать то, что вы хотите, но этот способ выполняется быстро и легко.

Ответ 2

В стандартной библиотеке 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"]

Это имеет недостаток в том, что содержимое последовательности должно быть хешируемым, а не только равнозначным, но в то же время наиболее равнодушными являются, в том числе, строки.

Он также сохраняет исходный порядок, в отличие от, скажем, помещения содержимого в словарь или набора, а затем получения их обратно.

Ответ 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).

Ответ 4

Используйте словарь, например var unique = [<yourtype>:Bool](), и заполните значения типа unique[<array value>] = true в цикле. Теперь unique.keys имеет то, что вам нужно.