본문 바로가기

개발/Swift

[Swift] Set 연산

반응형

출처 : Apple Developer Documentation

세트는 중복이 없는 unique와 nil이 포함되지 않는 non-nil 순위를 정의할 수 없는 무순위 콜렉션이다.
애플 공식 문서에 적혀있듯이 Set는 형식상 Hashable 프로토콜에 부합해야한다.

세트는 배열에 비해 데이터 접근 속도가 매우 효율적이다.
크기가 n인 배열이 있을 때 이 배열 요소를 검색하기 위한 시간이 최대 O(n)이 걸린다면,
세트의 효율은 크기에 관계없이 O(1)을 유지한다.

 

세트 선언 및 초기화

var firstSet = Set<String>()
var secontSet : Set = ["hi", "there", "fred"]

세트는 배열 요소의 타입을 스위프트가 추측하지 않으니 직접 타입을 명시적으로 선언해주어야한다.
세트 타입을 명시하지 않은 대신, 세트에 속한 배열 요소를 함께 선언하는 방법도 있다.
단, 세트의 요소는 모두 동일한 타입이어야한다.

 

세트 요소 추가 및 삭제

세트의 요소 추가

firstSet.insert("zipzap")
firstSet.update(with: "hungry")
// firstSet = ["zipzap", "hungry"]

 

세트의 요소 삭제

remove의 메소드들

secondSet.remove("fred")
secondSet.remove(at: secondSet.startIndex)
secondSet.removeAll()
// secondSet = []

 

 

세트 연산자

Set는 두 Set 간의 연산으로 합집합, 교집합, 여집합, 차집합 기능을 제공한다.

let food : Set = ["Fries", "Steak", "Pasta", "Waffle" ,"Coffee"]
let drink : Set = ["Juice", "Smoothie", "Coffee"]
let dessert : Set = ["Cake", "Cookie", "Fries", "Waffle"]

 

합집합

  • union(_: ) || fromUnion(_: ) 
    새로운 세트를 만들고, 두 세트의 합집합으로 원본 세트를 업데이트한다.
    두  세트의 모든 요소를 포함한다.
let Restaurant = food.union(drink)
// Restaurant = ["Fries", "Steak", "Pasta", "Waffle" ,"Coffee", "Juice", "Smoothie"]

var foods = food
foods.fromUnion(drink)
// foods = ["Fries", "Steak", "Pasta", "Waffle" ,"Coffee", "Juice", "Smoothie"]

 

 

교집합

  • intersection(_: ) || fromIntersection(_: )
    새로운 세트를 만들고, 두 세트의 교집합으로 원본 세트를 업데이트한다.
    두 세트에 공통적으로 있는 요소를 포함한다.
let basicDrink = drink.intersection(food)
// basicDrink = ["Coffee"]

var sameDrink = drink
sameDrink.formIntersection(food)
// sameDrink = ["Coffee"]

 

여집합

  • synnetrucDifference || fromSymmetricDifference(_: ) 
    새로운 세트를 만들고, 두 세트의 여집합 요소로 원본 세트를 업데이트한다.
    한 쪽에는 있지만 다른 쪽에는 없는 요소를 포함시킨다.
let dessertCafe = drink.symmetricDifference(dessert)
// dessertCafe = ["Fries", "Juice", "Waffle", "Coffee", "Smoothie", "Cookie", "Cake"]

var cafe = drink
cafe.formSymmetricDifference(dessert)
// cafe = ["Fries", "Juice", "Waffle", "Coffee", "Smoothie", "Cookie", "Cake"]

 

차집합

  • subtracting(_: ) || subtract(_: )
    새로운 세트를 만들고두 세트의 차집합 요소로 원본 세트를 업데이트한다.
    한 쪽과 다른 쪽을 비교해 공통되는 요소를 제외한다.
let onlyFood = food.subtracting(drink)
// onlyFood = ["Pasta", "Waffle", "Steak", "Fries"]

var lunch = food
lunch.subtract(drink)
// lunch = ["Pasta", "Waffle", "Steak", "Fries"]

 

 

Set에 사용하는 다른 메소드

  • isSubset(of: )
    어떤 세트의 요소가 특정 세트에 모두 포함되어 있는지 확인
  • isStrictSubset(of: )
    어떤 세트의 요소가 특정 세트에 모두 포함되어있지만, 동등한 집합은 아님을 확인
  • isSuperset(of: )
    특정 세트의 모든 요소가 다른 세트에 모두 포함되어있는지 확인
  • isStrictSuperset(of: )
    특정 세트의 모든 요소가 다른 세트에 포함되어있지만, 동등한 집합은 아님을 확인
  • isDisjoint(with: )
    세트에 공통 요소가 포함되어있는지 여부를 확인
반응형