우아한테크코스/1주차 프리코스
[Java] 컬렉션 - 맵(Map)
행복한라이언
2023. 10. 21. 16:33
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
반응형