[TIL] 2025-01-15_LinkedHashMap

Yuriยท2025๋…„ 1์›” 15์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
29/59

๐Ÿ”ซ ํ‚ค์˜ค์Šคํฌ ๊ณผ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๊ฒช์€ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•, ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์ ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๐Ÿง‘โ€๐Ÿ”ง ํ‚ค์˜ค์Šคํฌ ๊ณผ์ œ ๋ฆฌํŽ™ํ† ๋ง

์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋˜ ์ค‘ ์ฃผ๋ฌธ ์‹œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ถœ๋ ฅํ•  ๋•Œ ์ฃผ๋ฌธ ํ•ญ๋ชฉ์ด ๋ฉ”๋‰ด๋ช… ์ •๋ ฌ ์ˆœ์„œ๋„ ์•„๋‹ˆ๊ณ  ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์€ ์ˆœ์„œ๋„ ์•„๋‹Œ ์•Œ ์ˆ˜ ์—†๋Š” ๊ธฐ์ค€์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

๋ฌธ์ œ์ 

์ฃผ๋ฌธ์ˆœ์„œ๋ฉ”๋‰ด๋ช…
1ShackBurger
2SmokeShack
3Fresh Brewed Iced Tea
4Fountain Soda
5Cups & Cones

ํ‘œ์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฉ”๋‰ด๋ฅผ ๋‹ด๊ณ  ์ฃผ๋ฌธ

โ–ถ๏ธŽ ์‹คํ–‰ ๊ฒฐ๊ณผ

์›์ธ

์ฃผ๋ฌธ ํ’ˆ๋ชฉ์„ ๋‹ด๋Š” cartItems๋Š” HashMap<> ์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.

public class Cart {
    // menuItem(๋ฉ”๋‰ด๋ช…, ๊ฐ€๊ฒฉ์ •๋ณด)๊ณผ ์ˆ˜๋Ÿ‰์„ ์ €์žฅ
    final Map<MenuItem, Integer> cartItems = new HashMap<>();
    
    // ...
}

HashMap

  • ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์š”์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค. ํ‚ค(key) ๊ฐ’์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด์‹œ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๊ณ , ์ด ํ•ด์‹œ ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. ๋ฉ”๋‰ด๋ช… ์ •๋ ฌ ์ˆœ์„œ๋กœ ์ถœ๋ ฅ

โ–ถ๏ธŽ ๊ธฐ์กด์ฝ”๋“œ
printCart(): ์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ

// ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ถœ๋ ฅ
private void printCart() {
    // TODO: ์ฃผ๋ฌธ ๋ชฉ๋ก ์ถœ๋ ฅ ์‹œ ๋ฉ”๋‰ด๋ช… ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    for (Map.Entry<MenuItem, Integer> entry : cartItems.entrySet()) {
        MenuItem item = entry.getKey();
        String name = item.getName();
        double price = entry.getValue() * item.getPrice();
        String description = item.getDescription();
        System.out.printf("%-21s | W %.1f | %s%n", name, price, description);
    }
}

๐Ÿ’ญ Stream์˜ sorted()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •๋ ฌํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Comparator๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค?

  • comparingByKey[Value]: Map์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ Comparator<Map.Entry<K, V>>๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Integer ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” value๋Š” comparing ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, MenuItem ์„ ๋‹ด๊ณ  ์žˆ๋Š” key๋กœ๋Š” comparing ํ•  ์ˆ˜ ์—†๋‹ค.

๐Ÿšจ no instance(s) of type variable(s) U exist so that MenuItem conforms to Comparable<? super U>
โ†’ MenuItem์ด Comparable์„ ์ค€์ˆ˜ํ•˜๋„๋ก ์œ ํ˜• ๋ณ€์ˆ˜ U์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

MenuItem ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ํ•„๋“œ๊ฐ’๋“ค์ด ์กด์žฌํ•˜๊ณ , MenuItem ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•œ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ” ์ž…์žฅ์—์„œ๋Š” ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ• ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

โ–ถ๏ธŽ ๊ธฐ์ค€: Map<MenuItem, Integer>์˜ keySet()์˜ name ํ•„๋“œ๋กœ ์ •๋ ฌํ•œ ํ›„ ์ถœ๋ ฅ

๐Ÿ‘‰ ๊ธฐ์ค€์„ ์ž๋ฐ”์—๊ฒŒ ์•Œ๋ ค์ฃผ์ž!

โ–ถ๏ธŽ ๋ฐฉ๋ฒ•

  1. Comparable ์ธํ„ฐํŽ˜์ด์Šค implements
  2. compareTo() ์˜ค๋ฒ„๋ผ์ด๋”ฉ: ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ• ์ง€ ์ •์˜
public class MenuItem implements Comparable<MenuItem> {
	// ...
    
    // Comaparable ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ
    @Override
    public int compareTo(MenuItem o) {
        // ๊ธธ์ด ๋น„๊ต
        if (this.name.length() > o.name.length()) {
            return 1;
        } else if (this.name.length() < o.name.length()) {
            return -1;
        } else {
            // ๊ธธ์ด๊ฐ€ ๊ฐ™์œผ๋ฉด ์‚ฌ์ „์ˆœ
            return this.name.compareTo(o.name);
        }
    }
}

MenuItem ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ compareTo()์— ์ •์˜๋œ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

โ–ถ๏ธŽ ์ˆ˜์ • ์ฝ”๋“œ

// ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ถœ๋ ฅ
private void printCart() {
    // ์ฃผ๋ฌธ ๋ชฉ๋ก ์ถœ๋ ฅ ์‹œ ๋ฉ”๋‰ด๋ช… ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    List<Map.Entry<MenuItem, Integer>> entryList = cartItems.entrySet().stream()
                    .sorted(Map.Entry.<MenuItem, Integer>comparingByKey())
                    .toList();

    for (Map.Entry<MenuItem, Integer> entry : entryList) {
        MenuItem item = entry.getKey();
        String name = item.getName();
        double price = entry.getValue() * item.getPrice();
        String description = item.getDescription();
        System.out.printf("%-21s | W %.1f | %s%n", name, price, description);
        }
    }

stream().sorted().toList()๋กœ ๋ฐ˜ํ™˜๋ฐ›์€ entryList๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ถœ๋ ฅํ•œ๋‹ค.

2. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์€ ์ˆœ์„œ๋กœ ์ถœ๋ ฅ

cartItems์„ HashMap<>์ด ์•„๋‹Œ LinkedHashMap<>์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

โ–ถ๏ธŽ ์ˆ˜์ •์ฝ”๋“œ

public class Cart {
    // menuItem(๋ฉ”๋‰ด๋ช…, ๊ฐ€๊ฒฉ์ •๋ณด)๊ณผ ์ˆ˜๋Ÿ‰์„ ์ €์žฅ
    final Map<MenuItem, Integer> cartItems = new LinkedHashMap<>();
    
    // ...
}

LinkedHashMap

  • LinkedHashMap์€ HashMap๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฝ์ž… ์ˆœ์„œ ๋˜๋Š” ์ตœ๊ทผ ์ ‘๊ทผ ์ˆœ์„œ์— ๋”ฐ๋ผ ์š”์†Œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  • ์ž…๋ ฅ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ˆœํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • HashMap๊ณผ ๊ฐ™์ง€๋งŒ ์ž…๋ ฅ ์ˆœ์„œ๋ฅผ ๋งํฌ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์กฐ๊ธˆ ๋” ๋ฌด๊ฒ๋‹ค.
  • ์ž…๋ ฅ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

โ–ถ๏ธŽ ์ˆ˜์ •์ฝ”๋“œ

์ฃผ๋ฌธ ์‹œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ํ•ญ๋ชฉ์„ ์ถœ๋ ฅํ•˜๋Š” printCart()์—๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์€ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ์ด ๋” ์ ํ•ฉํ•˜์—ฌ 2๋ฒˆ์œผ๋กœ ์ˆ˜์ •

๋ฐฐ์šด ์ 

์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ๊ตฌํ˜„์ฒด๋“ค์„ ์ •๋ ฌํ•  ๋•Œ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ง€์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •๋ ฌ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
์•ˆ๋…•ํ•˜์„ธ์š” :)

0๊ฐœ์˜ ๋Œ“๊ธ€