Map / HashMap / 주요 명령 / .put / .containsKey / .containsValue / .remove(k) / .keySet() / .entrySet()
day 19
Map은 key - value 구조.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Map.html
package api.util.collection3;
import java.util.HashMap;
import java.util.Map;
public class Test01 {
public static void main(String[] args) {
//Map<K, V>
//- k(key)와 v(value)를 세트로 저장하는 저장소
//- k는 중복 불가, v는 중복 가능이다
//- k만 보면 Set<K>와 같다 (Set에 value가 하나씩 붙어있는 형태)
//ex : 이름과 나이를 저장하는 저장소
//k - 이름(String) , v - 나이(Integer)
//Map<String, Integer> people = new TreeMap<>();
Map<String, Integer> people = new HashMap<>();
//추가 - .add()는 데이터 1개 추가하는 명령 , 2개는 .put() 명령으로 추가하도록 설계
people.put("유재석", 50);
people.put("박명수", 51);
people.put("정형돈", 44);
people.put("하하", 42);
people.put("노홍철", 43);
people.put("하하", 44);//중복된 key가 추가될 경우 value가 수정됨
//검색 - .contains() 가 아니라 key,value별로 각각 존재
System.out.println(people.containsKey("정준하"));
System.out.println(people.containsValue(50));
//삭제 - .remove(k)
people.remove("노홍철");
//추출 - 박명수 몇살인가요?
System.out.println(people.get("박명수"));
System.out.println(people.get("정준하"));
//주의 - null이 나올 수도 있는 상황이라면 원시형을 사용할 수 없다
String name = "길";
Integer age = people.get(name);
System.out.println("나이 = " + age);
System.out.println(people);
System.out.println(people.size());
System.out.println(people.isEmpty());
}
}
Set<K>
Map<K> 같다고 생각해도 무방.. <V>
TreeMap : 잘 안씀, 정렬이 굳이 필요하지 않기 때문이다.
HashMap ***
- 데이터 추가
.add()는 데이터 1개일 때.Set과 List
.put()는 데이터 2개일 때 사용. / .putAll()
** 중복 된 key를 추가하면 value가 수정 됨 !
- 검색
.containsKey();
.containsValue();
- 삭제
.remove(k)
- 추출
.get(k)
but. 없는 key를 추출한다면 == null **
null이 나올 수도 있는 상황이라면 원시형은 사용할 수 없다
.size()
.isEmpty
Map 전체 출력
package api.util.collection3;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test04 {
public static void main(String[] args) {
//Map 전체 출력
//1. Map의 Key만 보면 Set과 같다. 따라서 Map의 Key를 Set으로 변환한 뒤 출력
//2. Map 내부에 Entry라는 중첩클래스가 존재하며 이 형태로 출력
//(참고) 전체 출력할 일은 흔치 않다
Map<String, Integer> people = new HashMap<>();
people.put("유재석", 50);
people.put("박명수", 51);
people.put("정형돈", 44);
people.put("하하", 42);
people.put("노홍철", 43);
//1
Set<String> set = people.keySet();//Map<K, V> → Set<K>
for(String name : set) {
int age = people.get(name);
System.out.println("이름 : " + name +", 나이 : " + age);
}
System.out.println();
//2
for(Map.Entry<String, Integer> entry : people.entrySet()) {
String name = entry.getKey();
int age = entry.getValue();
System.out.println("이름 : " + name +", 나이 : " + age);
}
}
}
전체 출력할 일은 흔치 않지만
2번 방법보다는 1번 방법이 더 쉽다.
1. Map을 Set으로 바꿔서 출력
.keySet()
for(String name : set) {
int age = .get(name)
sysout name age
2. Entry 중첩클래스
for(Map.Entry<> : .entrySet() {
int age = entry.getValue();
sysout name age
뭐래... 진짜 개어렵다
Map 예제
# Map
## Test02
다음 아이디와 비밀번호를 Map에 저장해두고 로그인 프로그램을 구현
- 아이디 : testuser , 비밀번호 : testuser1234
- 아이디 : student , 비밀번호 : student1234
- 아이디 : manager , 비밀번호 : manager1234
### 요구사항
- 사용자에게 아이디와 비밀번호를 입력받는다
- 저장소에 있는 아이디=비밀번호 정보와 일치하는 항목이 있다면 `로그인 성공` 출력
- 일치하는 항목이 없으면 `로그인 실패` 출력
## Test03
검색엔진 검색어 수집기 만들기
검색엔진은 사용자가 입력한 정보를 수집하도록 설계되어 있습니다.
이를 토대로 예측을 한다던가 다양한 방법으로 활용을 합니다.
빈도만 측정하려고 할 때, 사용자에게 지속적으로 검색어를 입력받고 이를 카운팅하는 프로그램을 구현
### 주의사항
- 대문자 소문자를 무시하도록 구현하세요
- `java`와 `j a v a`는 같은 단어로 취급되도록 처리
```
검색어 입력 : 자바
[자바] 검색이 완료되었습니다. 현재 검색횟수 [1]
검색어 입력 : 자바
[자바] 검색이 완료되었습니다. 현재 검색횟수 [2]
검색어 입력 : 파이썬
[파이썬] 검색이 완료되었습니다. 현재 검색횟수 [1]
검색어 입력 : 종료
검색 프로그램을 종료합니다.
```
풀이
'Hardcode > java' 카테고리의 다른 글
객체지향의 특징 (0) | 2023.01.15 |
---|---|
LIST, MAP, SET의 차이 (0) | 2023.01.15 |
집합 연산 - Set, List (0) | 2022.08.21 |
Collection - ArrayList, LinkedList, TreeSet, HashSet (0) | 2022.08.21 |
Collection - Set, List와의 차이 (0) | 2022.08.20 |