🌱 오늘의 주제 : Map 메소드
🌱 Map 메소드
Map 자료구조
- key와 value 쌍으로 이루어져 있다.
- key는 중복이 되지 않지만, value는 중복이 가능하다. (ex: 주민번호 - 이름)
- key를 통해 value를 빠르게 찾을 수 있다.(key는 입력할 때 hashing 처리함)
- value로 key를 찾기는 어렵다.
map의 메소드
get(키) | 키로 값을 얻어온다. | Object: 값을 반환 |
toString() | 리스트 값을 [값, 값...]의 문자열 형태로 돌려준다. | String |
put(키, 값) | 키와 값을 추가한다 | Object: 키가 이미 존재할 경우, 해당 키의 값을 반환 |
putAll(맵) | map을 통째로 추가한다. | void |
containsKey(값) | key가 있는지 확인 | boolean: 들어있는지 여부 |
containsValue(값) | value가 있는지 확인 | boolean: 들어있는지 여부 |
remove(key) | key에 해당하는 요소를 삭제한다. | Object(제네릭 설정된 타입): 삭제된 값 |
remove(key, value) | key와 value에 해당하는 요소를 삭제한다. | boolean: 삭제가 됐는지 여부 |
clear() | 모든 요소 삭제 | void |
isEmpty() | 리스트가 비어있는지 확인 | boolean: 비었는지 여부 |
keySet() | key들을 모아서 Set 자료형으로 반환 | Set: key들의 set |
values() | 값들을 모아서 Collection 자료형으로 반환 | Collection: value들을 Collection으로 반환 |
size() | map의 크기 | int: map의 크기 |
🌱 이차원 Map 활용 코드 예제
책이름으로 작가명 찾기
책이름을 입력 받으면 책의 작가명을 출력하는 프로그램
장르별로 책과 작가의 쌍이 n개 들어있다.
사용자로부터 책이름을 입력 받는다.
책이름에 해당하는 작가명을 출력한다.
예) 어린왕자의 작가명은 생텍쥐페리
public class SearchTest {
public static void main(String[] args) {
// {장르1={책제목1=작가1, 책제목2=작가2}, 장르2={책제목1=작가1, 책제목2=작가2}}
// {
// 자기계발={더 해빙=이서윤,홍주연, 말 그릇=김윤나, 메모의 마법=마에다 유지},
// 소설={어린왕자=생텍쥐페리, 아몬드=손원평, 나미야 잡화점의 기적=히가시노 게이고, 해변의 카프카=무라카미 하루키},
// 과학={시간은 흐르지 않는다=카를로 로벨리, 코스모스=칼 세이건, 평행우주=미치오 카쿠}
// }
Map<String, Map<String, String>> bookMap = new HashMap<>();
Map<String, String> map1 = new HashMap<>();
map1.put("더 해빙", "이서윤,홍주연");
map1.put("말 그릇", "김윤나");
map1.put("메모의 마법", "마에다 유지");
Map<String, String> map2 = new HashMap<>();
map2.put("어린왕자", "생텍쥐페리");
map2.put("아몬드", "손원평");
map2.put("나미야 잡화점의 기적", "히가시노 게이고");
map2.put("해변의 카프카", "무라카미 하루키");
Map<String, String> map3 = new HashMap<>();
map3.put("시간은 흐르지 않는다", "카를로 로벨리");
map3.put("코스모스", "칼 세이건");
map3.put("평행우주", "미치오 카쿠");
bookMap.put("자기계발", map1);
bookMap.put("소설", map2);
bookMap.put("과학", map3);
System.out.println(bookMap);
// 책 이름 입력
Scanner scan = new Scanner(System.in);
System.out.print("책이름을 입력해주세요: ");
String searchBook = scan.nextLine();
// TODO: 구현하기
}
}
package Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
public class Quiz04 {
public static void main(String[] args) {
// {장르1={책제목1=작가1, 책제목2=작가2}, 장르2={책제목1=작가1, 책제목2=작가2}}
// {
// 자기계발={더 해빙=이서윤,홍주연, 말 그릇=김윤나, 메모의 마법=마에다 유지},
// 소설={어린왕자=생텍쥐페리, 아몬드=손원평, 나미야 잡화점의 기적=히가시노 게이고, 해변의 카프카=무라카미 하루키},
// 과학={시간은 흐르지 않는다=카를로 로벨리, 코스모스=칼 세이건, 평행우주=미치오 카쿠}
// }
Map<String, Map<String, String>> bookMap = new HashMap<>();
Map<String, String> map1 = new HashMap<>();
map1.put("더 해빙", "이서윤,홍주연");
map1.put("말 그릇", "김윤나");
map1.put("메모의 마법", "마에다 유지");
Map<String, String> map2 = new HashMap<>();
map2.put("어린왕자", "생텍쥐페리");
map2.put("아몬드", "손원평");
map2.put("나미야 잡화점의 기적", "히가시노 게이고");
map2.put("해변의 카프카", "무라카미 하루키");
Map<String, String> map3 = new HashMap<>();
map3.put("시간은 흐르지 않는다", "카를로 로벨리");
map3.put("코스모스", "칼 세이건");
map3.put("평행우주", "미치오 카쿠");
bookMap.put("자기계발", map1);
bookMap.put("소설", map2);
bookMap.put("과학", map3);
//System.out.println(bookMap);
// 책 이름 입력
Scanner scan = new Scanner(System.in);
System.out.print("책이름을 입력해주세요: ");
String searchBook = scan.nextLine();
//책이름에 해당하는 작가명을 출력한다.
// 예) 어린왕자의 작가명은 생텍쥐페리
// 1번째 방법.
// Iterator<String> iter = bookMap.keySet().iterator();
// while(iter.hasNext()) {
// String genre = iter.next();
// if(bookMap.get(genre).containsKey(searchBook)) {
// // get(키) : 키로 값을 얻어온
// String author = bookMap.get(genre).get(searchBook); // bookMap의 장르에서 책이름을 author에 저장.
// System.out.println(searchBook +"의 작가명은 " + author);
// break; // 작가명을 찾았으면 불필요한 loop를 돌지 않고 종료.
// }
//
// }
// 2번째 방법.
Iterator<String> iter = bookMap.keySet().iterator();
while(iter.hasNext()) {
String genre = iter.next();
Map<String, String> book = bookMap.get(genre);
if(book.get(searchBook) != null) { // 책이 있으면
System.out.println(searchBook + "의 작가명은 "+ book.get(searchBook));
break;
}
}
}
}
-------
<결과>
책이름을 입력해주세요: 코스모스
코스모스의 작가명은 칼 세이건
🌱 자료구조 활용 추가문제1 - 파티원
파티원 구하기
필요한 파티원의 정보를 출력하세요.
탐색 시 Iterator를 사용하세요.
*n명의 게임 캐릭터 정보가 주어진다.
*필요한 파티원 조건:
- myCharacter와 같은 서버의 "힐러" 직업을 가진 멤버 후보를 모두 출력한다.
- 보너스 문제: 같은 서버의 힐러 중 레벨이 가장 높은 사람만 출력하세요.
public static void main(String[] args) {
Map<String, String> myCharacter = new HashMap<>();
myCharacter.put("닉네임", "마로비아나");
myCharacter.put("직업", "마법사");
myCharacter.put("서버", "B");
myCharacter.put("레벨", "38");
// [{닉네임=닉네임1, 직업=전사, 레벨=5}, {닉네임=닉네임1, 직업=전사, 레벨=5}...]
List<Map<String, String>> charaters = new ArrayList<>();
Map<String, String> character1 = new HashMap<>();
character1.put("닉네임", "사자고양이");
character1.put("직업", "전사");
character1.put("서버", "A");
character1.put("레벨", "11");
charaters.add(character1);
Map<String, String> character2 = new HashMap<>();
character2.put("닉네임", "하구루");
character2.put("직업", "마법사");
character2.put("서버", "B");
character2.put("레벨", "46");
charaters.add(character2);
Map<String, String> character3 = new HashMap<>();
character3.put("닉네임", "바다");
character3.put("직업", "힐러");
character3.put("서버", "B");
character3.put("레벨", "23");
charaters.add(character3);
Map<String, String> character4 = new HashMap<>();
character4.put("닉네임", "초보");
character4.put("직업", "힐러");
character4.put("서버", "A");
character4.put("레벨", "4");
charaters.add(character4);
Map<String, String> character5 = new HashMap<>();
character5.put("닉네임", "린다G");
character5.put("직업", "힐러");
character5.put("서버", "B");
character5.put("레벨", "84");
charaters.add(character5);
// TODO: 구현
}
package Map;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class Quiz05 {
public static void main(String[] args) {
// 자료구조 활용 추가문제1 - 파티원
Map<String, String> myCharacter = new HashMap<>();
myCharacter.put("닉네임", "마로비아나");
myCharacter.put("직업", "마법사");
myCharacter.put("서버", "B");
myCharacter.put("레벨", "38");
// [{닉네임=닉네임1, 직업=전사, 레벨=5}, {닉네임=닉네임1, 직업=전사, 레벨=5}...]
List<Map<String, String>> charaters = new ArrayList<>();
Map<String, String> character1 = new HashMap<>();
character1.put("닉네임", "사자고양이");
character1.put("직업", "전사");
character1.put("서버", "A");
character1.put("레벨", "11");
charaters.add(character1);
Map<String, String> character2 = new HashMap<>();
character2.put("닉네임", "하구루");
character2.put("직업", "마법사");
character2.put("서버", "B");
character2.put("레벨", "46");
charaters.add(character2);
Map<String, String> character3 = new HashMap<>();
character3.put("닉네임", "바다");
character3.put("직업", "힐러");
character3.put("서버", "B");
character3.put("레벨", "23");
charaters.add(character3);
Map<String, String> character4 = new HashMap<>();
character4.put("닉네임", "초보");
character4.put("직업", "힐러");
character4.put("서버", "A");
character4.put("레벨", "4");
charaters.add(character4);
Map<String, String> character5 = new HashMap<>();
character5.put("닉네임", "린다G");
character5.put("직업", "힐러");
character5.put("서버", "B");
character5.put("레벨", "84");
charaters.add(character5);
// 같은 서버 그리고 힐러 직업.
int max = 0; // 제일 높은 레벨.
Map<String, String> maxCharacter = null; // 레벨이 제일 높은 사람.
Iterator<Map<String, String>> iter = charaters.iterator();
while(iter.hasNext()) {
Map<String, String> character = iter.next();
//System.out.println(character);
String server = character.get("서버");
String job = character.get("직업"); //전사 마법사 힐러 힐러 힐러
// 1.1번째 방법. 레벨이 높은 사람.
if(server.equals(myCharacter.get("서버")) && job.equals("힐러")) {
//System.out.println(character); // charaters 아니고.. character 프린트해야됨.
Integer level = Integer.parseInt(character.get("레벨")); // 문자열 -> 기본형 Integer.parseInt
if(max < level) {
max = level;
maxCharacter = character;
}
}
// //2. 2번재 방법. 레벨이 높은 사람
//
// maxCharacter = character;
// if(maxCharacter.get("레벨").compareTo(character.get("레벨")) < 0) { // A.compareTo(B) 기준값(A)이 더 크면 : 1, B가 더 크면 -1, 같으면 0
// maxCharacter = character;
// }
} // while 끝
System.out.println(maxCharacter);
}
}
-------
<결과>
{서버=B, 레벨=84, 닉네임=린다G, 직업=힐러}
🌱 Map 활용하기(2) - 수도이름 맞추기
나라의 수도 이름 맞추기
랜덤으로 뽑힌 나라의 이름을 맞추는 게임
나라-수도가 들어있는 20개의 쌍이 주어진다.
이 중 랜덤으로 5개의 문제가 주어지고, 사용자로부터 나라에 해당하는 수도를 입력 받는다.
정답인지 아닌지 수도를 입력한 즉시 출력한다.
모두 풀고 나면 점수(100점 만점)가 출력된다.
- 여유가 되면 문제가 중복되지 않도록 추가한다.
public class CapitalTest {
public static final Map<String, String> capitalMap = new HashMap<String, String>() {
{
put("대한민국", "서울");
put("덴마크", "코펜하겐");
put("독일", "베를린");
put("러시아", "모스크바");
put("벨기에", "브뤼셀");
put("브라질", "브라질리아");
put("스웨덴", "스톡홀름");
put("스위스", "베른");
put("스페인", "마드리드");
put("아르헨티나", "부에노스아이레스");
put("이집트", "카이로");
put("이란", "테헤란");
put("이탈리아", "로마");
put("일본", "도쿄");
put("필리핀", "마닐라");
put("핀란드", "헬싱키");
put("프랑스", "파리");
put("튀르키예", "앙카라");
put("캐나다", "오타와");
put("콜롬비아", "보고타");
}
};
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Random rand = new Random();
Set<String> keys = capitalMap.keySet();
List<String> keyList = new ArrayList<>(keys); // 나라이름 List의 index로 문제 낼 것
// TODO: 구현하기
}
}
package Map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
public class Quiz03 {
public static final Map<String, String> capitalMap = new HashMap<String, String>() {
{
put("대한민국", "서울");
put("덴마크", "코펜하겐");
put("독일", "베를린");
put("러시아", "모스크바");
put("벨기에", "브뤼셀");
put("브라질", "브라질리아");
put("스웨덴", "스톡홀름");
put("스위스", "베른");
put("스페인", "마드리드");
put("아르헨티나", "부에노스아이레스");
put("이집트", "카이로");
put("이란", "테헤란");
put("이탈리아", "로마");
put("일본", "도쿄");
put("필리핀", "마닐라");
put("핀란드", "헬싱키");
put("프랑스", "파리");
put("튀르키예", "앙카라");
put("캐나다", "오타와");
put("콜롬비아", "보고타");
}
};
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Random rand = new Random();
// **** map은 객체 꺼낼 때 keySet() 메소드로 모든 키를 set 컬렉션으로 얻고 반복문 후 get() 메소드로 얻을 수 있다.
// ****** 여기서는 list로 바꿔서 반복문을 돌림. set 컬렉션은 index가 없기 때문에...
Set<String> keys = capitalMap.keySet(); // keys: 나라이름
List<String> keyList = new ArrayList<>(keys); // keyList : 나라이름
// 중복검사
List<Integer> quizIndex = new ArrayList<>();
int score = 0;
for(int i = 0; i < 5; i ++) {
int randIndex = rand.nextInt(20); // 0 ~ 19
// 중복 검사
if (quizIndex.contains(randIndex)) {
i--; // 중복이면 다시 돈다.
continue;
}
quizIndex.add(randIndex); // 냈던 문제의 index 저장( 중복 검사 위해..)
//중복 검사 끝.
// arrayList - get(index) : 저장된 위치(index)에 저장된 객체를 반환.
String country = keyList.get(randIndex);
System.out.print(country + "의 수도 이름은?");
String answer = scan.nextLine();
if(answer.equals(capitalMap.get(country))){
System.out.println("정답");
score += 100 / 5;
} else {
System.out.println("틀렸습니다.");
}
} // for
System.out.println("총 점수는 : " + score);
}
}
-----
<결과>
이집트의 수도 이름은?몰라
틀렸습니다.
스위스의 수도 이름은?베른
정답
러시아의 수도 이름은?모스크바
정답
콜롬비아의 수도 이름은?서울
틀렸습니다.
프랑스의 수도 이름은?파리
정답
총 점수는 : 60
'Java > Map' 카테고리의 다른 글
Java - Map 사용법 (0) | 2023.02.12 |
---|