코딩 노트

Java.util.collection - Map 본문

Java

Java.util.collection - Map

newbyeol 2023. 7. 14. 10:24

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