[Kotlin] Map 정렬

hee09·2022년 2월 25일
1
post-thumbnail

HashMap 또는 Map을 정렬하는 방법

  • LinkedHashMap을 이용하여 정렬
  • TreeMap을 이용하여 정렬
  • List를 이용하여 정렬
  • SortedMap을 이용하여 정렬

LinkedHashMap을 이용하여 정렬

LinkedHashMap은 Map에 입력한 순서가 보장되는 클래스입니다. HashMap을 원하는 순서대로 정렬하고 이 순서대로 다시 LinkedHashMap에 입력하면 정렬된 순서대로 출력할 수 있습니다.


Sort by key

Map.Entry를 리스트로 가져와 key 값으로 정렬하고, 정렬된 순서대로 LinkedHashMap에 추가하면 됩니다. 코드는 아래와 같습니다.

fun sortMapByKey(map: Map<String, String>): LinkedHashMap<String, String> {
    val entries = LinkedList(map.entries)

    entries.sortBy { it.key }

    val result = LinkedHashMap<String, String>()
    for(entry in entries) {
        result[entry.key] = entry.value
    }

    return result
}

fun main() {
    val map = LinkedHashMap<String, String>()
    map["Korea"] = "Seoul"
    map["Japan"] = "Tokyo"
    map["America"] = "New york"
    map["England"] = "London"
    map["Canada"] = "Ottawa"

    val sortedMap = sortMapByKey(map)

    // key(String)에 따른 정렬
    for((key, value) in sortedMap.entries) {
        println("Key : $key, value : $value")
    }
}

결과(Key를 기준으로 오름차순)

Key : America, value : New york
Key : Canada, value : Ottawa
Key : England, value : London
Key : Japan, value : Tokyo
Key : Korea, value : Seoul

Sort by Value

Map.Entry를 리스트로 가져와 Value를 기준으로 정렬하고, 정렬된 순서대로 LinkedHashMap에 추가하면 됩니다. 코드는 아래와 같습니다.

fun sortMapByKey(map: Map<String, String>): LinkedHashMap<String, String> {
    val entries = LinkedList(map.entries)

    entries.sortBy { it.value }

    val result = LinkedHashMap<String, String>()
    for(entry in entries) {
        result[entry.key] = entry.value
    }

    return result
}

fun main() {
    val map = LinkedHashMap<String, String>()
    map["Korea"] = "Seoul"
    map["Japan"] = "Tokyo"
    map["America"] = "New york"
    map["England"] = "London"
    map["Canada"] = "Ottawa"

    val sortedMap = sortMapByKey(map)

    // key(String)에 따른 정렬
    for((key, value) in sortedMap.entries) {
        println("Key : $key, value : $value")
    }
}

결과(Value를 기준으로 오름차순)

Key : England, value : London
Key : America, value : New york
Key : Canada, value : Ottawa
Key : Korea, value : Seoul
Key : Japan, value : Tokyo

TreeMap을 이용하여 정렬

TreeMap은 아이템을 추가할 때 설정한 Comparator로 정렬되어 저장하도록 구현된 클래스입니다. 따라서 값을 추가한 이후에 다시 정렬할 필요가 없습니다. 아래 코드처럼 TreeMap을 생성할 수 있고, 인자를 지정하지 않으면 기본적으로 key를 사용하여 정렬합니다.

map = TreeMap<String, String>()
map["Korea"] = "Seoul"
map["Japan"] = "Tokyo"
map["America"] = "New york"
map["England"] = "London"
map["Canada"] = "Ottawa"

// key(String)에 따른 정렬
for((key, value) in map.entries) {
    println("Key : $key, value : $value")
}

결과(key를 기준으로 오름차순)

Key : America, value : New york
Key : Canada, value : Ottawa
Key : England, value : London
Key : Japan, value : Tokyo
Key : Korea, value : Seoul

아래와 같이 comparator를 지정하여 원하는 기준으로 정렬할 수도 있습니다. 다만, TreeMap은 Value를 정렬하지 않기 때문에 Key를 정렬하는 경우만 사용하면 됩니다.

map = TreeMap<String, String>(compareBy<String?> { it }.reversed())
map["Korea"] = "Seoul"
map["Japan"] = "Tokyo"
map["America"] = "New york"
map["England"] = "London"
map["Canada"] = "Ottawa"

// key(String)에 따른 정렬
for((key, value) in map.entries) {
    println("Key : $key, value : $value")
}

결과(key를 기준으로 내림차순)

Key : Korea, value : Seoul
Key : Japan, value : Tokyo
Key : England, value : London
Key : Canada, value : Ottawa
Key : America, value : New york

List를 이용하여 정렬

Keys 또는 Values를 List로 가져온 뒤에, 정렬하는 방법도 있습니다. 둘 중에 한 종류만 정렬이 필요한 경우, 아래와 같은 방법을 사용하면 됩니다.


Sort by key

아래 코드는 key가 들어있는 List를 오름차순으로 정렬합니다.

val map = HashMap<String, String>()
map["Korea"] = "Seoul"
map["Japan"] = "Tokyo"
map["America"] = "New york"
map["England"] = "London"
map["Canada"] = "Ottawa"

val keyList = ArrayList(map.keys)

// comparator를 사용한 정렬
// keyList.sortWith(compareBy<String?> { it }.reversed())

// default 정렬
keyList.sort()

for(key in keyList) {
    println("Key : $key")
}

결과(Key를 기준으로 오름차순)

Key : America
Key : Canada
Key : England
Key : Japan
Key : Korea

위 코드에서 sort()를 사용하여 default 정렬을 수행하였지만 sortWith 함수를 사용하고 인자로 comparator를 준다면 원하는 조건을 사용하여 정렬을 수행할 수 있습니다.


Sort by Value

아래 코드는 Value가 들어있는 List를 오름차순으로 정렬합니다.

val map = HashMap<String, String>()
map["Korea"] = "Seoul"
map["Japan"] = "Tokyo"
map["America"] = "New york"
map["England"] = "London"
map["Canada"] = "Ottawa"

val valueList = ArrayList(map.values)

// comparator를 사용한 정렬
// valueList.sortWith(compareBy<String?> { it }.reversed())

// default 정렬
valueList.sort()

for(value in valueList) {
    println("Value : $value")
}

결과(Value를 기준으로 오름차순)

Value : London
Value : New york
Value : Ottawa
Value : Seoul
Value : Tokyo

sortedMap을 이용하여 정렬

toSortedMap() 함수를 이용하여 Map을 정렬할 수 있습니다. sortedMap은 키를 기준으로 정렬한 Map이고 Comparator를 사용하여 원하는 조건을 명시할 수도 있습니다.

val map = HashMap<String, String>()
map["Korea"] = "Seoul"
map["Japan"] = "Tokyo"
map["America"] = "New york"
map["England"] = "London"
map["Canada"] = "Ottawa"

val sortedMap = map.toSortedMap()

// Comparator를 인자로 주어 조건 명시
// val sortedMap = map.toSortedMap(compareBy<String> { it }.reversed())

for((key, value) in sortedMap) {
    println("Key : $key, Value : $value")
}

결과(Key를 기준으로 오름차순)

Key : America, Value : New york
Key : Canada, Value : Ottawa
Key : England, Value : London
Key : Japan, Value : Tokyo
Key : Korea, Value : Seoul

참조
Java - Map을 정렬(sorting)하는 다양한 방법

틀린 부분은 댓글로 남겨주시면 수정하겠습니다..!!

profile
되새기기 위해 기록

0개의 댓글