셋 특화 연산
셋 특화 연산 (Set-specific operations)
Kotlin 컬렉션 패키지에는 셋에 대한 인기 있는 연산, 즉 교집합 찾기, 병합, 서로 다른 컬렉션을 빼는 작업을 위한 확장 함수가 들어 있어요.
두 컬렉션을 하나로 병합하려면 union() 함수를 사용해요. 이것은 중위 형태 a union b로 쓸 수 있어요. 순서가 있는 컬렉션의 경우 피연산자의 순서가 중요하다는 점을 기억하세요. 결과 컬렉션에서 첫 번째 피연산자의 요소가 두 번째 피연산자의 요소보다 앞에 와요.
출처: Kotlin 공식 문서
본문
fun main() {
//sampleStart
val numbers = setOf("one", "two", "three")
// 순서에 따른 출력
println(numbers union setOf("four", "five"))
// [one, two, three, four, five]
println(setOf("four", "five") union numbers)
// [four, five, one, two, three]
//sampleEnd
}
두 컬렉션 사이의 교집합(두 컬렉션 모두에 존재하는 요소)을 찾으려면 intersect() 함수를 사용해요. 다른 컬렉션에 존재하지 않는 컬렉션 요소를 찾으려면 subtract() 함수를 사용해요. 이 두 함수도 중위 형태로 호출할 수 있어요. 예를 들어 a intersect b처럼요.
fun main() {
//sampleStart
val numbers = setOf("one", "two", "three")
// 같은 출력
println(numbers intersect setOf("two", "one"))
// [one, two]
println(numbers subtract setOf("three", "four"))
// [one, two]
println(numbers subtract setOf("four", "three"))
// [one, two]
//sampleEnd
}
두 컬렉션 중 하나에는 존재하지만 교집합에는 없는 요소를 찾으려면, union() 함수를 쓸 수도 있어요. 이 연산(대칭 차집합, symmetric difference)을 위해 두 컬렉션 사이의 차이를 계산하고 결과를 병합해요.
fun main() {
//sampleStart
val numbers = setOf("one", "two", "three")
val numbers2 = setOf("three", "four")
// 차이 병합하기
println((numbers - numbers2) union (numbers2 - numbers))
// [one, two, four]
//sampleEnd
}
union(), intersect(), subtract() 함수를 리스트에도 적용할 수 있어요. 다만 그 결과는 항상 Set이에요. 이 결과에서 중복 요소는 모두 하나로 병합되고 인덱스 접근은 사용할 수 없어요.
fun main() {
//sampleStart
val list1 = listOf(1, 1, 2, 3, 5, 8, -1)
val list2 = listOf(1, 1, 2, 2, 3, 5)
// 두 리스트의 교집합 결과는 Set
println(list1 intersect list2)
// [1, 2, 3, 5]
// 같은 요소들은 하나로 병합됨
println(list1 union list2)
// [1, 2, 3, 5, 8, -1]
//sampleEnd
}