Java Map 사용하기 좋은 함수들

: ) YOUNG·2025년 7월 12일
1

알고리즘

목록 보기
480/483

computeIfAbsent

  • 맵에 키가 없으면 함수를 실행한다.

val name = "John"
val map = mutableMapOf<String, Int>()

// 1. 'John' 키가 없으므로 람다 함수 { key -> key.length } 가 실행됩니다.
//    - key는 "John"이 됩니다.
//    - "John".length는 4를 반환합니다.
//    - map에 {"John" = 4}가 저장되고, 4가 반환됩니다.
val length1 = map.computeIfAbsent(name) { key ->
    println("'$key' 키가 없으므로 길이를 계산합니다.") // 이 줄은 처음 한 번만 실행됨
    key.length
}
println("반환된 값: $length1") // 반환된 값: 4
println("맵 상태: $map")       // 맵 상태: {John=4}

println("--------------------")

// 2. 'John' 키가 이미 존재하므로 람다 함수는 실행되지 않습니다.
//    - 기존 값인 4가 즉시 반환됩니다.
val length2 = map.computeIfAbsent(name) { key ->
    println("'$key' 키가 없으므로 길이를 계산합니다.") // 이 줄은 실행되지 않음!
    key.length
}
println("반환된 값: $length2") // 반환된 값: 4
println("맵 상태: $map")       // 맵 상태: {John=4} (변화 없음)



computeIfPresent

  • 맵에 키가 있으면 함수를 실행한다.

    val userPoints = mutableMapOf("alex" to 100, "brian" to 150)
    println("초기 상태: $userPoints")

// 1. 'alex' 키가 존재하므로, 람다 함수를 실행해 값을 업데이트합니다.
//    - oldValue는 100이 됩니다.
//    - 람다는 100 + 50 = 150을 반환합니다.
//    - 'alex'의 값은 150으로 변경됩니다.
    val updatedAlexPoints = userPoints.computeIfPresent("alex") { key, oldValue ->
        println("'$key'의 점수($oldValue)를 업데이트합니다.")
        oldValue + 50
    }
    println("반환된 값: $updatedAlexPoints") // 반환된 값: 150
    println("'alex' 업데이트 후: $userPoints")

    println("--------------------")

// 2. 'charlie' 키는 존재하지 않으므로, 람다 함수는 실행되지 않습니다.
//    - 맵은 변경되지 않고, null이 반환됩니다.
    val updatedCharliePoints = userPoints.computeIfPresent("charlie") { key, oldValue ->
        // 이 코드는 절대 실행되지 않음!
        println("'$key'의 점수($oldValue)를 업데이트합니다.")
        oldValue + 50
    }
    println("반환된 값: $updatedCharliePoints") // 반환된 값: null
    println("'charlie' 시도 후: $userPoints")


    userPoints.computeIfPresent("brian") { key, oldValue ->
        if (oldValue >= 150) {
            println("'$key'의 점수가 기준을 충족하여 맵에서 삭제합니다.")
            null // null을 반환하면 해당 항목이 삭제됨
        } else {
            oldValue
        }
    }



TreeMap

첫번째 데이터 가져오기

firstKey(), firstEntry()


println("최저 점수: ${studentScores.firstKey()}")         // 출력: 최저 점수: 76
println("최고 점수 학생: ${studentScores.lastEntry()}") // 출력: 최고 점수 학생: 95=브라이언


마지막 데이터 가져오기

lastKey(), lastEntry()


val topStudent = studentScores.pollLastEntry() // 최고점 학생을 꺼내옴
println("시상할 학생: $topStudent")           // 출력: 시상할 학생: 95=브라이언
println("시상 후 남은 학생: $studentScores")  // 출력: 시상 후 남은 학생: {76=소피아, 87=에밀리, 91=데이빗}


  • lowerKey(key): 주어진 key보다 작은 키 중 가장 큰 값 (< key)

  • floorKey(key): 주어진 key보다 작거나 같은 키 중 가장 큰 값 (<= key)

  • higherKey(key): 주어진 key보다 큰 키 중 가장 작은 값 (> key)

  • ceilingKey(key): 주어진 key보다 크거나 같은 키 중 가장 작은 값 (>= key)

특정 범위의 데이터만 잘라보기 (Sub Map)

  • headMap(key) : 처음부터 주어진 key 전까지 맵

  • tailMap(key) : 주어진 key부터 끝까지의 맵

  • subMap(fromKey, toKey) : fromKey부터 toKey전까지의 맵

0개의 댓글