[Kotlin] STL 정리하기 - MutableSet, MutableMap


개요

Kotlin STL 정리하기의 마지막 편으로 예상하는 MutableSet & MutableMap에 대한 포스트 입니다.


MutableSet

집합을 의미하는 Set, MutableSet 자료구조의 STL은 전반적으로 List, MutableList와 거의 동일합니다. 따라서 리스트 자료구조를 사용하는 것과 동일하게 사용하면 되고, 추가적으로 아래와 같은 메서드만 알아두면 됩니다.


intersect

set 2개의 교집합을 갖는 set을 리턴합니다.

1
2
3
infix fun <T> Iterable<T>.intersect(
    other: Iterable<T>
): Set<T>
1
print(setOf(1,2,3).intersect(setOf(2,3,4))) // [2, 3]


union

set 2개의 합합집합을 갖는 set을 리턴합니다.

1
infix fun <T> Iterable<T>.union(other: Iterable<T>): Set<T>
1
print(setOf(1,2,3).union(setOf(2,3,4))) // [1, 2, 3, 4]


SortedSet

Kotlin은 삽입 시에 자동으로 요소들이 정렬되는 SortedSet 자료구조도 제공합니다. 내부적으로는 JavaTreeSet으로 구현되어 있으며, STL은 Set과 동일합니다.


sortedSetOf

SortedSet을 생성합니다.

1
2
val sortedSet = sortedSetOf(3, 1, 2)
print(sortedSet) // [1, 2, 3]


toSortedSet

일반적인 SetSortedSet으로 변환합니다.

1
print(setOf(3, 1, 2).toSortedSet()) // [1, 2, 3]


MutableMap

Map은 유일한 keyvalue가 매치되어 있는 형태의 자료구조로, Kotlin의 경우 Entry<K, V> 형태의 객체를 map의 element로 갖습니다. MapMutableMap 또한 집합 자료구조와 동일하게 ListMutableList의 STL을 사용할 수 있습니다. 아래는 그 외에 Map에서만 사용 가능한 STL 목록입니다.


keys

Mapkey 목록을 담은 set을 반환합니다.

1
abstract val keys: MutableSet<K>
1
2
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
print(map.keys) // [1, 2, 3]


values

Mapvalue 목록을 담은 set을 반환합니다.

1
abstract val values: MutableCollection<V>
1
2
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
print(map.values) // [one, two, three]


put & set

Mapkey에 따른 value를 추가합니다. set 메서드를 통해 []를 이용할 수 있습니다.

1
2
abstract fun put(key: K, value: V): V?
operator fun <K, V> MutableMap<K, V>.set(key: K, value: V)
1
2
3
4
val map = mutableMapOf<Int, String>()
map.put(1, "one")
map[1] = "one"
print(map) // {1=one}


filterKeys

특정 조건을 만족하는 key만 포함하는 map을 반환합니다.

1
2
3
fun <K, V> Map<out K, V>.filterKeys(
    predicate: (K) -> Boolean
): Map<K, V>
1
2
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
print(map.filterKeys { it < 2 }) // {1=one}


filterValues

특정 조건을 만족하는 value만 포함하는 map을 반환합니다.

1
2
3
fun <K, V> Map<out K, V>.filterValues(
    predicate: (V) -> Boolean
): Map<K, V>
1
2
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
print(map.filterValues { it.length < 5 }) // {1=one, 2=two}


get

특정 key에 따른 value를 반환하고, 없을 시 null을 반환합니다.

1
operator fun <K, V> Map<out K, V>.get(key: K): V?
1
2
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
print(map[1]) // one


getOrElse

특정 key에 따른 value를 반환하고, 없을 시 기본값을 반환하는 함수를 정의해 이를 반환합니다.

1
2
3
4
fun <K, V> Map<K, V>.getOrElse(
    key: K,
    defaultValue: () -> V
): V
1
2
3
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
println(map.getOrElse(0) { "other" }) // other
println(map[0] ?: "other" ) // other


mapKeys

기존 map에서 value를 유지하고 key값들만 변환한 새로운 map을 반환합니다.

1
2
3
fun <K, V, R> Map<out K, V>.mapKeys(
    transform: (Entry<K, V>) -> R
): Map<R, V>
1
2
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
print(map.mapKeys { it.key.toString() + it.value }) // {1one=one, 2two=two, 3three=three}


mapValues

기존 map에서 key를 유지하고 value들만 변환한 새로운 map을 반환합니다.

1
2
3
fun <K, V, R> Map<out K, V>.mapValues(
    transform: (Entry<K, V>) -> R
): Map<K, R>
1
2
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
print(map.mapValues { it.key.toString() + it.value }) // {1=1one, 2=2two, 3=3three}


toSortedMap

Mapkey값을 주어진 조건에 따라 정렬한 SortedMap을 반환합니다.

1
2
3
fun <K, V> Map<out K, V>.toSortedMap(
    comparator: Comparator<in K>
): SortedMap<K, V>
1
2
val map = mapOf(1 to "one", 3 to "three", 2 to "two")
print(map.toSortedMap(compareByDescending { it })) // {3=three, 2=two, 1=one}


마치며

이로써 문자열, 리스트에 이어 집합 및 테이블 형태의 자료구조까지 STL을 정리해보았습니다. 정리하면서 깨달은 Kotlin STL의 또 다른 장점은 바로 Iteratable 형태를 갖는 모든 자료구조는 공통적으로 사용하는 STL이 많이 겹친다는 것입니다. 예를 들어 any, all, filter, map과 같이 유용한 메서드들이 모든 자료구조에서 동일한 기능으로 제공되기 때문에, 설령 익숙치 않은 자료구조더라도 쉽게 STL을 예측해서 사용할 수 있습니다.

지금까지 작성한 Kotlin STL에 대한 게시글은 추후 알고리즘 문제를 풀며 유용한 STL 사용법을 발견할 시 지속적으로 업데이트 할 예정입니다.

0%