셋 특화 연산

셋 특화 연산 (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
}

더 알아보기 (Learn more)