๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] SortedMap

์ถœ์ฒ˜

ChatGPT


 

SortedMap์€ ์ž๋ฐ”์˜ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ •๋ ฌ๋œ ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋Š” ๋งต์ด๋‹ค. SortedMap์€ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์‚ฝ์ž…, ์‚ญ์ œ ๊ฒ€์ƒ‰ ์‹œ ํ•ญ์ƒ ์ด ์ •๋ ฌ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋œ๋‹ค.

 

1. SortedMap์˜ ์ฃผ์š” ํŠน์ง•

ํ‚ค ๊ธฐ๋ฐ˜ ์ •๋ ฌ

SortedMap์€ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‚ค์˜ ์ž์—ฐ ์ˆœ์„œ(Natural Ordering)์— ๋”ฐ๋ผ ์ •๋ ฌ๋˜๋ฉฐ, Comparator๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ค‘๋ณต๋œ ํ‚ค ๋ถˆํ—ˆ

SortedMap์€ ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋™์ผํ•œ ํ‚ค๊ฐ€ ์‚ฝ์ž…๋˜๋ฉด ๊ธฐ์กด ๊ฐ’์„ ๋ฎ์–ด์“ด๋‹ค.

null ํ‚ค ํ—ˆ์šฉ ์—ฌ๋ถ€

SortedMap์˜ ๊ตฌํ˜„์ฒด์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ null ํ‚ค๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, TreeMap์€ null ํ‚ค๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ •๋ ฌ๋œ ๋งต์˜ ๋ฒ”์œ„ ์กฐํšŒ

SortedMap์€ ํ‚ค์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ํŠน์ • ๋ฒ”์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

2. SortedMap์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ

SortedMap ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

1. ๋ฒ”์œ„ ์กฐํšŒ ๋ฉ”์†Œ๋“œ

1. subMap(K fromKey, K toKey)

์ฃผ์–ด์ง„ ๋‘ ํ‚ค ์‚ฌ์ด์˜ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ์„œ๋ธŒ๋งต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์‹œ์ž‘ ํ‚ค๋Š” ํฌํ•จ๋˜๊ณ , ๋ ํ‚ค๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š๋‹ค.

2. headMap(K toKey)

์ฃผ์–ด์ง„ ํ‚ค๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ์„ ํฌํ•จํ•˜๋Š ์„œ๋ธŒ๋งต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3. tailMap(K fromKey)

์ฃผ์–ด์ง„ ํ‚ค๋ณด๋‹ค ํฐ ๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ์„ ํฌํ•จํ•˜๋Š” ์„œ๋ธŒ๋งต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์ด ๋ฉ”์†Œ๋“œ๋“ค์€ ํŠน์ • ๋ฒ”์œ„์— ์†ํ•œ ๋ฐ์ดํ„ฐ๋งŒ์„ ๊ฐ€์ ธ์™€ ์ž‘์—…ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

2. ์ •๋ ฌ๋œ ๋งต์˜ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ

1. firstKey()

๋งต์—์„œ ๊ฐ€์žฅ ์ž‘์€ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2. lastKey()

๋งต์—์„œ ๊ฐ€์žฅ ํฐ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์ด ๋ฉ”์†Œ๋“œ๋“ค์€ ๋งต์˜ ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ํ‚ค๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

3. ์ •๋ ฌ ๊ธฐ์ค€ ์ œ๊ณต ๋ฉ”์†Œ๋“œ

1. comparator()

๋งต์ด ์‚ฌ์šฉํ•˜๋Š” Comparator๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ ๋งต์ด ๊ธฐ๋ณธ ์ž์—ฐ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ, null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด SortedMap์ด ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ํ‚ค๋ฅผ ์ •๋ ฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. SortedMap์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค

TreeMap

SortedMap์˜ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒผ๋กœ, ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์ด๋‹ค. TreeMap์€ ํ•ญ์ƒ ํ‚ค๋ฅผ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, SortedMap๊ณผ  NavigableMap์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

4. SortedMap์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ์˜ˆ์‹œ

๋‹ค์Œ์€ TreeMap์„ ์‚ฌ์šฉํ•ด SortedMap์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ด๋‹ค.

import java.util.*;

public class SortedMapExample {
    public static void main(String[] args) {
        // TreeMap์„ ํ†ตํ•ด SortedMap ๊ตฌํ˜„
        SortedMap<String, Integer> sortedMap = new TreeMap<>();

        // TreeMap์— ํ‚ค-๊ฐ’ ์Œ ์ถ”๊ฐ€
        sortedMap.put("apple", 10);
        sortedMap.put("banana", 20);
        sortedMap.put("cherry", 30);
        sortedMap.put("date", 40);
        sortedMap.put("elderberry", 50);

        // ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ํ‚ค
        System.out.println("First key: " + sortedMap.firstKey());
        System.out.println("Last key: " + sortedMap.lastKey());

        // ํŠน์ • ๋ฒ”์œ„์˜ ์„œ๋ธŒ๋งต
        SortedMap<String, Integer> subMap = sortedMap.subMap("banana", "date");
        System.out.println("\nSubMap from 'banana' to 'date': " + subMap);

        // headMap (์ฃผ์–ด์ง„ ํ‚ค๋ณด๋‹ค ์ž‘์€ ํ‚ค-๊ฐ’ ์Œ๋“ค)
        SortedMap<String, Integer> headMap = sortedMap.headMap("cherry");
        System.out.println("\nHeadMap up to 'cherry': " + headMap);

        // tailMap (์ฃผ์–ด์ง„ ํ‚ค๋ณด๋‹ค ํฐ ํ‚ค-๊ฐ’ ์Œ๋“ค)
        SortedMap<String, Integer> tailMap = sortedMap.tailMap("cherry");
        System.out.println("\nTailMap from 'cherry': " + tailMap);
    }
}

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

First key: apple
Last key: elderberry

SubMap from 'banana' to 'date': {banana=20, cherry=30}

HeadMap up to 'cherry': {apple=10, banana=20}

TailMap from 'cherry': {cherry=30, date=40, elderberry=50}

 

  • firstKey()์™€ lastKey()  : ๊ฐ€์žฅ ์ž‘์€ ํ‚ค์™€ ๊ฐ€์žฅ ํฐ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • subMap() : ํŠน์ • ํ‚ค์˜ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ์„œ๋ธŒ๋งต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” "banana"์—์„œ "date"๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด ์„œ๋ธŒ๋งต์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค. "data"๋Š” ํฌํ•จ๋˜์ง€ ์•Š์•˜๋‹ค.
  • haedMap() : ์ฃผ์–ด์ง„ ํ‚ค๋ณด๋‹ค ์ž‘์€ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋งต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • tailMap() : ์ฃผ์–ด์ง„ ํ‚ค๋ณด๋‹ค ํฐ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋งต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

5. SortedMap์˜ ํ™œ์šฉ

SortedMap์€ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ์กฐํšŒ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค. ํ‚ค๊ฐ€ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์— ์ ํ•ฉํ•˜๋‹ค.

1. ๋ฒ”์œ„ ์กฐํšŒ

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ ์งœ๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋‚ ์งœ ๋ฒ”์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ, SortedMap์˜ subMap(), headMap(), tailMap() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋ฉด ์‰ฝ๊ฒŒ ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ตœ์†Œ/์ตœ๋Œ€ ๊ฐ’ ์ฒ˜๋ฆฌ

SortedMap์€ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ๋„๋Š” ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. firstKey()์™€ lastKey() ๋ฉ”์†Œ๋“œ๋Š” ์ตœ์†Œ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

3. ์ด์ง„ ํƒ์ƒ‰ ๊ธฐ๋ฐ˜ ์ž‘์—…

SortedMap์€ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ์ด์ง„ ํƒ์ƒ‰๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ž‘์—…์—๋„ ์œ ๋ฆฌํ•˜๋‹ค. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

6. SortedMap๊ณผ Map์˜ ์ฐจ์ด์ 

ํŠน์ง• Map SortedMap
์ •๋ ฌ ํ‚ค์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š์Œ ํ‚ค๊ฐ€ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋จ
๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ์กฐํšŒ ์ œ๊ณต๋˜์ง€ ์•Š์Œ subMap(), headMap(), tailMap() ๋ฉ”์†Œ๋“œ ์ œ๊ณต
์ตœ์†Œ/์ตœ๋Œ€ ๊ฐ’ ์ฒ˜๋ฆฌ firstKey()์™€ lastKey() ์—†์Œ firstKey(), lastKey() ์ œ๊ณต
๊ธฐ๋ณธ ๊ตฌํ˜„์ฑ„ HashMap, Hashtable๋“ฑ TreeMap

 

7. ์ •๋ ฌ ๊ธฐ์ค€

SortedMap์€ ํ‚ค์˜ ์ž์—ฐ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ •๋ ฌ๋˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ ๊ธฐ์ค€(Comparator)์„ ์ œ๊ณตํ•˜์—ฌ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ์ž์—ฐ ์ˆœ์„œ

ํ‚ค๊ฐ€ Comparable์„ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ, SortedMap์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์—ฐ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ •๋ ฌ์ด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Integer, String, Double๊ณผ ๊ฐ™์€ ํƒ€์ž…์€ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค.

2. ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ

์‚ฌ์šฉ์ž๊ฐ€ Comparator๋ฅผ ์ œ๊ณตํ•˜๋ฉด, ํ•ด๋‹น ์ •๋ ฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ํ‚ค๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ Comparator๋ฅผ ์‚ฌ์šฉํ•œ TreeMap์˜ ์˜ˆ์‹œ์ด๋‹ค.

import java.util.*;

public class CustomSortedMapExample {
    public static void main(String[] args) {
        // ํ‚ค๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” Comparator๋ฅผ ๊ฐ€์ง„ TreeMap ์ƒ์„ฑ
        Comparator<String> comparator = (s1, s2) -> s2.compareTo(s1);
        SortedMap<String, Integer> sortedMap = new TreeMap<>(comparator);

        // TreeMap์— ํ‚ค-๊ฐ’ ์Œ ์ถ”๊ฐ€
        sortedMap.put("apple", 10);
        sortedMap.put("banana", 20);
        sortedMap.put("cherry", 30);
        sortedMap.put("date", 40);
        sortedMap.put("elderberry", 50);

        // TreeMap ์ถœ๋ ฅ (๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋จ)
        System.out.println("TreeMap with custom comparator: " + sortedMap);
    }
}

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

TreeMap with custom comparator: {elderberry=50, date=40, cherry=30, banana=20, apple=10}

 

8. ๊ฒฐ๋ก 

SortedMap์€ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋งต ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. TreeMap์ด ๊ทธ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด์ด๋ฉฐ, ์ž์—ฐ ์ˆœ์„œ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ SortedMap์€ ๋ฒ”์œ„ ์กฐํšŒ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.