Я создаю приложение iOS со скоростью, и мне нужно получить все уникальные значения массива строк.
Я читал документы разработчиков Apple, но у него, похоже, нет функции.
Может кто-нибудь подскажет мне?
Я создаю приложение iOS со скоростью, и мне нужно получить все уникальные значения массива строк.
Я читал документы разработчиков Apple, но у него, похоже, нет функции.
Может кто-нибудь подскажет мне?
Один из способов - использовать набор:
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))
}
}
Есть, вероятно, более оптимизированные способы делать то, что вы хотите, но этот способ выполняется быстро и легко.
В стандартной библиотеке 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"]
Это имеет недостаток в том, что содержимое последовательности должно быть хешируемым, а не только равнозначным, но в то же время наиболее равнодушными являются, в том числе, строки.
Он также сохраняет исходный порядок, в отличие от, скажем, помещения содержимого в словарь или набора, а затем получения их обратно.
Я не знаю встроенного способа. Эта общая функция сделала бы это:
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).
Используйте словарь, например var unique = [<yourtype>:Bool]()
, и заполните значения типа unique[<array value>] = true
в цикле. Теперь unique.keys
имеет то, что вам нужно.