developer tip

신속한 배열의 고유 값

copycodes 2020. 11. 19. 21:39
반응형

신속한 배열의 고유 값


이 질문에 이미 답변이 있습니다.

신속하게 iOS 앱을 구축 중이며 문자열 배열의 모든 고유 값을 가져와야합니다.

나는 애플 개발자 문서를 읽었지만 그것에 대한 기능이없는 것 같습니다.

누군가 나에게 힌트를 줄 수 있습니까?


한 가지 방법은 세트를 사용하는 것입니다.

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필요한 것이 있습니다.

참고 URL : https://stackoverflow.com/questions/27624331/unique-values-of-array-in-swift

반응형