코딩 노트
Java.util.collection - Map 본문
Map
- 개별 데이터를 빠르게 접근하여 처리할 수 있도록 고안된 세트 저장소이다.
- 세트 저장소(key-value 저장소)
- key는 이름, value는 값의 역할을 수행한다.
- key는 유일해야하나, value는 중복을 허용한다.
- List, Set은 한 개의 데이터를 저장하는 반면에 Map은 두 개를 세트로 저장한다.
- 대부분의 명령이 List, Set과 같지만 일부 명령은 저장소 특성상 차이가 있다.
- Set에 value가 붙어있는 형태로 봐도 무방하다.
Map의 생성방법
Map<String, Integer> map = new TreeMap<>();
Map<String, Integer> map = new HashMap<>();
데이터 추가
- add가 아니라 put
- 데이터 개수가 다르기 때문이다.
map.put("유재석", 50);
map.put("강호동", 53);
key가 중복되면 기존 항목의 value가 수정된다.
value는 중복이 가능하다.
map.put("유재석", 51);
데이터 검색
- 데이터를 검색할 때 key/value용 contains가 따로 있다.
System.out.println(map.containsKey("유재석"));
System.out.println(map.containsValue(50));
데이터 삭제
map.remove("유재석");
데이터 추출
- 없는 키 값을 넣으면 null을 출력한다.
System.out.println(map.get("박명수"));
(EX) 아이디, 패스워드 로그인 예제
if (a.containsKey(inputId) && inputPw.equals(a.get(inputId)) ) {
System.out.print("로그인 성공");
}
else {
System.out.print("로그인 실패");
}
(EX) 투표프로그램 예제
1번째 방법
Map<String, Integer> tv = new HashMap<>();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("이름 입력:" );
String name = sc.next();
if (name.equals("종료")) {
break;
}
if (tv.containsKey(name)) {
int num = tv.get(name);
tv.put(name, num+1);
System.out.println(name + " 현재 " + (num+1) + "표");
} else {
tv.put(name, 1);
System.out.println(name + " 현재 " + 1 + "표");
}
}
sc.close();
System.out.println(tv);
2번째 방법
Map<String, Integer> tv = new HashMap<>();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("이름 입력:" );
String name = sc.next();
if (name.equals("종료")) {
break;
}
if (tv.containsKey(name)) { //이름이 있으면
int count = tv.get(name); //이름에 해당하는 득표수 추출
count++;
tv.put(name, count);
System.out.println(name + " 현재 " + (count++) + "표");
} else { //이름이 없으면
int count = 1;
tv.put(name, count);
System.out.println(name + " 현재 " + 1 + "표");
}
}
sc.close();
System.out.println(tv);
3번째 방법
//투표함 만들기
Map<String, Integer> tv = new HashMap<>();
//샘플 데이터 추가
Scanner sc = new Scanner(System.in);
while (true) {
//사용자가 투표한 내용을 투표함에 반영
System.out.print("이름 입력:" );
String name = sc.next();
if (name.equals("종료")) {
break;
}
name = name.replace("", "").toLowerCase();
//이름에 공백이 들어간 경우를 해결, 소문자대문자 다르게 한 경우 해결
Integer count = tv.get(name); //이름에 대한 득표수 추출
if (count == null) { //득표수가 null이라면(이름이 없다면)
tv.put(name, 1);//득표수 1로 등록
}
else { //아니면
tv.put(name, count+1);//득표수 1증가 처리
}
//출력
System.out.println("["+name+"] 현재 득표수 " + tv.get(name));
}
sc.close();
System.out.println(tv);
Map의 전체출력
Map도 key와 value를 미리 입력하여 생성할 수 있다. 단, 불변의 향태로 생성된다.
Map<String, Integer> vote = Map.of("아이유" , 5, "피카츄", 2, "영탁", 4, "마리오", 10);
Map에서 key만 보면 set의 형태이다.
그래서 일단 key만 추출하여 출력하고, value는 그때그때 가져와서 사용한다.
Map은 개별 데이터 처리에 특화되어 있기 때문에 전체 데이터를 출력하고 처리할 것이라면 List를 쓰는게 맞다.
↓ Set을 이용한 Map의 전체출력문
Set<String> names = vote.keySet(); //vote의 key만 추출하라.
for (String name : names) {
int count = vote.get(name);
System.out.println("이름 = " + name + " , 득표수 = " + count);
}
'Java' 카테고리의 다른 글
Java.io.file - single (0) | 2023.07.14 |
---|---|
Java.util.collection - Stack, Queue (0) | 2023.07.14 |
Java.util.collection - Set (0) | 2023.07.13 |
Java Class (0) | 2023.07.12 |
Java.util.collection - List (0) | 2023.07.12 |