LinkedHashMap은 Map에 입력한 순서가 보장되는 클래스입니다. HashMap을 원하는 순서대로 정렬하고 이 순서대로 다시 LinkedHashMap에 입력하면 정렬된 순서대로 출력할 수 있습니다.
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 : America, value : New york
Key : Canada, value : Ottawa
Key : England, value : London
Key : Japan, value : Tokyo
Key : Korea, value : Seoul
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")
}
}
Key : England, value : London
Key : America, value : New york
Key : Canada, value : Ottawa
Key : Korea, value : Seoul
Key : Japan, value : Tokyo
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 : 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 : Korea, value : Seoul
Key : Japan, value : Tokyo
Key : England, value : London
Key : Canada, value : Ottawa
Key : America, value : New york
Keys 또는 Values를 List로 가져온 뒤에, 정렬하는 방법도 있습니다. 둘 중에 한 종류만 정렬이 필요한 경우, 아래와 같은 방법을 사용하면 됩니다.
아래 코드는 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 : America
Key : Canada
Key : England
Key : Japan
Key : Korea
위 코드에서 sort()를 사용하여 default 정렬을 수행하였지만 sortWith 함수를 사용하고 인자로 comparator를 준다면 원하는 조건을 사용하여 정렬을 수행할 수 있습니다.
아래 코드는 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 : London
Value : New york
Value : Ottawa
Value : Seoul
Value : Tokyo
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 : America, Value : New york
Key : Canada, Value : Ottawa
Key : England, Value : London
Key : Japan, Value : Tokyo
Key : Korea, Value : Seoul
참조
Java - Map을 정렬(sorting)하는 다양한 방법
틀린 부분은 댓글로 남겨주시면 수정하겠습니다..!!