반응형
swift의 고유한 배열
저는 swift로 iOS 앱을 만들고 있는데 문자열 배열의 모든 고유한 값을 얻어야 합니다.
애플 개발자 문서를 읽어봤는데 기능이 없는 것 같습니다.
누가 힌트 좀 줄래요?
더 효율적인 방법이 있을 수 있지만, 확장이 가장 간단할 것은 다음과 같습니다.
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"]
// order NOT guaranteed
let unique = Array(Set(array))
// ["three", "one", "two"]
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(n2)에서 실행된다는 것입니다.
다음과 같은 사전 사용var unique = [<yourtype>:Bool]()
다음과 같은 값을 입력합니다.unique[<array value>] = true
빙글빙글. 지금.unique.keys
당신이 필요한 것을 가지고 있습니다.
언급URL : https://stackoverflow.com/questions/27624331/unique-values-of-array-in-swift
반응형
'sourcecode' 카테고리의 다른 글
ORA-00604 ORA-12705 (0) | 2023.08.07 |
---|---|
mariadb 또는 mysql에서 json 배열 내의 요소를 찾고 삭제하는 방법 (0) | 2023.08.07 |
PL/SQL에서 레코드 표 사용 (0) | 2023.08.07 |
시스템입니다.웹.캐싱 또는 시스템.런타임.캐시는 에 적합합니다.NET 4 웹 애플리케이션 (0) | 2023.08.02 |
해쉬방? 안 해쉬방? (0) | 2023.08.02 |