본문 바로가기
우아한테크코스/1주차 프리코스

[Java] 컬렉션 - 맵(Map)

by 행복한라이언 2023. 10. 21.
728x90
반응형

1. 맵(Map)

  • 키 key 와 값 value 의 쌍
  • 키와 값의 자료형은 다양하게 가능
  • 예시
    • 학생 번호 (숫자) / 학생 이름 (문자열)
    • 과목명 (문자열) / 성적 코드 (문자)
    • 반 번호 (문자열) / 학생들 (학생 인스턴스의 ArrayList)
  • 키값은 중복될 수 없음
    • 같은 키에 다시 값을 넣으면 기존 값 대체(갱신)

2. 공통 메서드

0) 생성

    // Map<Key, Value> numNameHashMap = new HashMap<>();
    Map<Integer, String> numNameHashMap = new HashMap<>();

 

1) 값 추가: put, putAll

    Map<Integer, String> numNameHashMap = new HashMap<>();
    // ⭐ put: 요소 삽입
    numNameHashMap.put(1, "홍길동");
    numNameHashMap.put(2, "전우치");
    numNameHashMap.put(3, "임꺽정");
    numNameHashMap.put(4, "홍길동");

    Map<Integer, String> numNameHashMap2 = new HashMap<>();
    // ⭐ put: 요소 삽입
    numNameHashMap.put(6, "홍길동");
    numNameHashMap.put(1, "전우치");
    numNameHashMap.put(8, "임꺽정");
    numNameHashMap.put(9, "홍길동");

    //  ⭐ putAll: 컬렉션 삽입
    numNameHashMap.putAll(numNameHashMap2);
    System.out.println(numNameHashMap);
    // 키가 중복되는 경우 삽입한 컬렉션의 Value값으로 갱신
    // {1=전우치, 2=전우치, 3=임꺽정, 4=홍길동, 6=홍길동, 8=임꺽정, 9=홍길동}
    
    //  💡(응용) putAll : 대상 맵으로부터 전부 가져옴
    Map<Integer, String> numNameHMapClone = new HashMap<>();
    numNameHMapClone.putAll(numNameHMap);

 

2) 값 삭제: remove

    // ⭐️요소 자체를 지우기 -> return boolean: 있었는지 여부 반환
    numNameHMap.remove(1); // 주어진 키가 있다면 삭제
    
    // 주어진 키와 값의 쌍이 있다면 삭제 -> 있는지 없는지 판단 boolean 리턴
    boolean const = numNameHMap.remove(2, "황대장");

 

3) 포함여부 확인: containsKey, containsValue

    // 💡 containsKey / containsValue : 키 / 값 포함되는 쌍 있는지 확인
    boolean contains1 = numNameHashMap.containsKey(1);
    boolean contains2 = numNameHashMap.containsValue("홍길동");

 

4) 요소 개수 확인: size / 빈 맵인지 확인: isEmpty / 모든 데이터 삭제: clear 

    // 요소 개수
    int intsSize = intHSet.size(); 

    // size가 0인지 여부 반환
    boolean intsIsEmpty = intHSet.isEmpty(); 

    // 모든 데이터 삭제
    intHSet.clear();

 

5) 요소 접근: get( key로 value로 접근)

    // get 메소드에 key를 넣어 value에 접근
    String no2 = numNameHMap.get(2);
    Double leeHeight = nameHeightHMap.get("이장신");
    
    //  ⚠️ 잘못된 키 입력시 null 반환
    String wrong1 = numNameHMap.get(0);
    Double wrong2 = nameHeightHMap.get(3);

 

6) 대체: replace(K, V)

    // {1=전우치, 2=전우치, 3=임꺽정, 4=홍길동, 6=홍길동, 8=임꺽정, 9=홍길동}
    System.out.println(numNameHashMap);
    numNameHashMap.replace(1, "광개토대왕");
    // {1=광개토대왕, 2=전우치, 3=임꺽정, 4=홍길동, 6=홍길동, 8=임꺽정, 9=홍길동}
    System.out.println(numNameHashMap);

 

7) key와 value 뽑기( python에서 dic.keys(), dic.values(), dic.items()와 유사 )

    //  💡 keySet 메소드 - 키들의 Set(인터페이스) 반환 -> Set메서드 사용!
    Set<Integer> numSet = numNameHMap.keySet();
    Set<Integer> numHSet = new HashSet<>();
    numHSet.addAll(numSet);

    //  keySet을 활용한 for-each
    for (var n : numNameHMap.keySet()) {
    System.out.println(numNameHMap.get(n));
    }
    for (var side : sideUnitsHMap.keySet()) {
    for (var unit : sideUnitsHMap.get(side)) {
    System.out.println(unit);
    	}
    }

    //⭐️(응용)value로 key 접근//
    public static <K, V> K getKey(Map<K, V> map, V value) {
    for (K key : map.keySet()) {
    if (value.equals(map.get(key))) {
        return key;
    		}
    	}
    return null;
    }

2. HashMap, TreeMap

  • 를 저장하는 방식에 있어 해시셋/트리셋과 같음
    • 해시맵 : 키의 해시코드 / 키
    • 트리맵 : 키를 트리 형태로 저장
  • 정렬 무관 빠른 접근시에는 해시맵, 키순으로 정렬 필요시 트리맵
    //  ⭐️ 키 순으로 정렬됨 확인
    TreeMap<Integer, String[]> classKidsTMap = new TreeMap<>();
    classKidsTMap.put(3, new String[] {"서아", "이준", "아린"});
    classKidsTMap.put(9, new String[] {"하윤", "서준", "지호"});
    classKidsTMap.put(1, new String[] {"이서", "하준", "아윤"});
    classKidsTMap.put(7, new String[] {"지안", "은우", "예준"});
    classKidsTMap.put(5, new String[] {"서윤", "시우", "하은"});

 

    //  트리 전용 메소드들
    int firstKey = classKidsTMap.firstKey();
    int lastKey = classKidsTMap.lastKey();

 

    NavigableMap<Integer, String> map = new TreeMap<>();
    map.put(1, "One");
    map.put(3, "Three");
    map.put(5, "Five");
    // map에서 키가 4보다 크거나 같은 가장 작은 키
    System.out.println(map.ceilingKey(4)); // 출력: 5
    // map에서 키가 4보다 작거나 같은 가장 작은 키
    System.out.println(map.floorKey(4)); // 출력: 3

 

출처 및 참고) 제대로 파는 자바(Java) - by 얄코(https://www.inflearn.com/course/%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%8C%8C%EB%8A%94-%EC%9E%90%EB%B0%94)

728x90
반응형