swift

swift - Set #1 (Create a Set, Inspecting a Set, Testing MemberShip, Adding and Removing Elements)

행복하게사는게꿈 2021. 1. 7. 04:45

Set

 

- 배열과 딕셔너리에 비해 많이 사용되지는 않는다.

 

- 주로 정렬 순서보다 검색 속도가 더 중요한 경우 배열 대신 사용

 


순서가 없다. 인덱스도 없음

 


동일한 값은 하나만 저장 -> 있는 값을 저장하면 그냥 무시됨


동일한 타입만 저장


배열보다 검색속도가 빠른 이유

해싱 알고리즘을 사용하기 때문에

 


Create a Set

// Set
// Set은 리터럴이 없고 배열 리터럴을 사용한다.
let set = [1, 2, 2, 2, 3, 3, 3]
set.count

let set2 = Set<Int>(set)
set2.count

Inspecting a Set

set2.count
set2.isEmpty

Testing for Membership

// 요소가 포함되어 있는지 확인하는 작업에 제일 많이 사용
set2.contains(1)

Adding and Removing Elements

var words = Set<String>()

// 추가하고 결과를 튜플로 return
var insertResult = words.insert("Swift")

insertResult.inserted // 추가되었으면 true 안됐으면 false
insertResult.memberAfterInsert // 추가된 값 or 기존에 있던 값

insertResult = words.insert("Swift")
insertResult.inserted // 추가되었으면 true 안됐으면 false
insertResult.memberAfterInsert // 추가된 값 or 기존에 있던 값

// 새로운 요소를 추가하면 nil, update하면 입력한 파라미터 return
var updateResult = words.update(with: "Apple")
updateResult

var value = "Swift"
value.hashValue

updateResult = words.update(with: value)
updateResult

value = "Hello"
value.hashValue

updateResult = words.update(with: value)
updateResult

// Set이 update될때 hash값으로 비교한다.

struct SampleData: Hashable {
    var hashValue: Int = 123
    var data: String
    
    init(_ data: String) {
        self.data = data
    }
    
    static func == (lhs: SampleData, rhs:SampleData) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }
}

var sampleSet = Set<SampleData>()
var data = SampleData("Swift")
data.hashValue

var r = sampleSet.insert(data)
r.inserted
r.memberAfterInsert
sampleSet

data.data = "Hello"
data.hashValue

// 여기서 다시보면 hashValue가 123으로 고정이기 때문에 문자열이 다르더라도 최신
// 데이터로 바뀌지 않는다.
r = sampleSet.insert(data)
r.inserted
r.memberAfterInsert
sampleSet

// 이 때 사용하는 메소드가 update이다.
sampleSet.update(with: data)
sampleSet



// 요소를 삭제

// 하나의 element 삭제 : 삭제 후 삭제된 value 리턴
words.remove("Swift")
words

// 존재하지 않는 요소 삭제 : nil 리턴
words.remove("Ghost")

// 전체요소 삭제
words.removeAll()