Map
- Map은 List와 Set과는 다르게 키와 값을 한쌍으로 묶은 원소를 다룬다
- 키의 역할은 값을 찾기 위한 역할이다
- 때문에 키가 중복되면 값을 찾을 수 없으므로 키는 중복될 수 없다
- 키가 다르다면 값은 중복될 수 있다
- java.util 패키지 import 필요
- Map 객체 및 인터페이스 변수 선언시 제네릭을 사용하여 키와 값의 타입을 정한다 순서)
- <키타입,값타입>
- Map에서는 원소를 추가할때 put 메소드를 사용한다. 첫번째 매개값은 키 객체, 두번째 매개값은 값 객체 이때 키가 중복된다면 마지막에 대입한 값으로 변경한다
- Map에서는 get 메소드를 사용하면 키가 일치하는 값을 찾을 수 있다
- 보통 관례적으로 키 타입은 String을 사용한다
- 이미 hashCode와 equals가 재정의되어있어 사용하기 편하기 때문이다
properties
- 키와 값을 String 타입으로 제한한 Map 컬렉션
- .프로퍼티즈 파일을 읽어 들일 때 주로 사용
TreeSet, TreeMap
- set 이나 map에 담지 않고 별도로 사용함
- 이진 트리를 사용하여 검색 기능을 강화시킴
- 객체를 저장하면 자동으로 정렬됨
- 왼쪽 자식 노드 : 부모보다 작은 값
- 오른쪽 자식 노드 : 부모보다 큰 값
import java.util.*;
public class MapMain {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("A", 10);
//map.put(10,"A"); 위에서 map 의 키 타입은 문자열, 값 타입은 정수라고 했으므로 오류
map.put("B", 10);
System.out.println(map.size()); //2
map.put("A", 20);
System.out.println(map.size()); //키 값은 중복되지 않아 그대로 갯수는 2
int value = map.get("A");
System.out.println("키 A의 값 :"+value); //20
System.out.println("map.get('B') =>" + map.get("B")); //10
map.put("B", 30);
System.out.println("map.get('B') =>" + map.get("B")); //30
}
}
실행결과)
2 2 키 A의 값 :20 map.get('B') =>10 map.get('B') =>30 |
map 안에 있는 모든 원소에 접근하기
1. keySet() 메소드 사용하기
map안에 있는 모든 키들로 이루어진 set을 가져오기
1) Iterator를 사용하여 map의 모든 원소를 출력
Set<String> keys = map.keySet();
Iterator<String> keyIterator = keys.iterator();
while(keyIterator.hasNext()) {
String key = keyIterator.next();
int value2 = map.get(key);
System.out.println("key:" + key + ", value:" + value2);
}
System.out.println();
실행결과)
key:A, value:20 key:B, value:30 |
2) 향상된 for문으로 map의 모든 원소를 출력
Set<String> keys = map.keySet();
for(String key : keys) {
int value2 = map.get(key);
System.out.println("key:" + key + ", value:" + value2);
}
실행결과)
key:A, value:20 key:B, value:30 |
2. entrySet() 메소드 사용하기
1) Map.Entry 타입(제네릭 타입) 원소로 이루어진 set을 꺼내오기
2) set 안에 있는 원소 Map.Entry 타입을 활용하여 모든 원소 접근하기
Iterator 사용하여 출력
Set<Map.Entry<String,Integer>> entrys = map.entrySet();
Iterator<Map.Entry<String,Integer>> entryIterator = entrys.iterator();
while(entryIterator.hasNext()) {
Map.Entry<String,Integer> entry = entryIterator.next();
String key = entry.getKey();
int value2 = entry.getValue();
System.out.println("key:" + key + ", value:" + value2);
}
실행결과)
key:A, value:20 key:B, value:30 |
향상된 for문을 사용하여 출력
Set<Map.Entry<String,Integer>> entrys = map.entrySet();
for(Map.Entry<String,Integer> entry : entrys) {
System.out.println("key:" + entry.getKey() + ", value:" + entry.getValue());
}
실행결과)
key:A, value:20 key:B, value:30 |
map에서 원소 삭제는 key가 일치하는 원소 객체를 제거함
map.remove("A");
System.out.println(map.get("A")); //null
평균 점수, 최고 점수, 최고 점수를 받은 아이디를 출력하도록 코드를 작성하기
Iterator로 출력하기
import java.util.*;
public class MapExample {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("blue", 96);
map.put("hong", 86);
map.put("white", 92);
String name = null; //최고점수를 받은 아이디를 저장하는 변수
int maxScore = 0; //최고점수를 저장하는 변수
int totalScore = 0; //점수 합계를 저장하는 변수
Set<String> mapSet = map.keySet();
Iterator<String> mapIterator = mapSet.iterator();
while(mapIterator.hasNext()) {
String key = mapIterator.next();
int value = map.get(key);
totalScore += value;
if(value > maxScore) {
maxScore = value;
name = key;
}
}
System.out.println("평균 점수:" + totalScore/map.size());
System.out.println("최고 점수:" + maxScore);
System.out.println("최고 점수를 받은 아이디: " + name);
}
}
실행결과)
평균 점수:91 최고 점수:96 최고 점수를 받은 아이디: blue |
향상된 for문으로 출력하기
import java.util.*;
public class MapExample {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("blue", 96);
map.put("hong", 86);
map.put("white", 92);
String name = null; //최고점수를 받은 아이디를 저장하는 변수
int maxScore = 0; //최고점수를 저장하는 변수
int totalScore = 0; //점수 합계를 저장하는 변수
Set<String> mapSet = map.keySet();
for(String key : mapSet) {
totalScore += map.get(key);
if(map.get(key) > maxScore) {
maxScore = map.get(key);
name = key;
}
}
System.out.println("평균 점수:" + totalScore/map.size());
System.out.println("최고 점수:" + maxScore);
System.out.println("최고 점수를 받은 아이디: " + name);
}
}
실행결과)
평균 점수:91 최고 점수:96 최고 점수를 받은 아이디: blue |
Map은 키와 값 모두 객체를 허용하기 때문에 키도 모든 클래스를 타입으로 가질 수 있다
이때 동등 객체 키인지 판별하기 위하여 HashMap은 클래스의 hashCode와 equals 메소드를
사용하여 판별한다
만약 키 클래스에 hashCode와 equals 메소드를 재정의한적 없다면 주소를 사용하여 동등 객체를 판별한다
import java.util.*;
public class MapMain2 {
public static void main(String[] args) {
Map<Student,Member> map = new HashMap<>();
map.put(new Student("홍길동","동학교",24), new Member("홍길동",10,"hong"));
map.put(new Student("홍길동","동학교",24), new Member("김길동",20,"kim"));
//Student 클래스는 이름과 나이가 같으면 동등객체로 판별되도록
//hashCode와 equals가 재정의되어 있기 때문에 1개
System.out.println(map.size());
System.out.println(map.get(new Student("홍길동","동학교",24)).getName()); //김길동
}
}
보통 관례적으로 키 타입은 String을 사용한다
이미 hashCode와 equals가 재정의되어있어 사용하기 편하기 때문이다
Map<String,Member> map2 = new HashMap<>();
map2.put("001", new Member("홍길동",10,"hong"));
map2.put("002", new Member("김길동",20,"kim"));
System.out.println(map2.size());
System.out.println(map2.get("002").getName());
아래 실행예를 확인하여 계좌번호를 관리하는 프로그램을 구현하세요.(계좌번호는 키로 관리합니다)
실행예)
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>1
계좌번호>111-111
예금주>홍길동
초기잔고>1000
계좌가 개설되었습니다.
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>1
계좌번호>111-111
예금주>이길동
초기잔고>2000
계좌가 중복되어 개설되지 못했습니다.
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>1
계좌번호>111-222
예금주>이길동
초기잔고>2000
계좌가 개설되었습니다.
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>2
계좌번호>111-222
존재하는 계좌번호 입니다.
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>3
계좌번호>111-222
입금액>1000
이길동님의 111-222계좌에 1000원이 입금되어 잔액은 3000입니다.
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>4
계좌번호>111-222
출금액>4000
이길동님의 111-222계좌 잔액부족입니다.
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>4
계좌번호>111-222
출금액>1000
이길동님의 111-222계좌에 1000원이 출금되어 잔액은 2000입니다.
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>5
[전체 계좌]
111-111 홍길동 1000원
111-222 이길동 2000원
------------------------------------------------------------------------------
1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료
------------------------------------------------------------------------------
입력>6
프로그램 종료
public class User2 {
private String name; //이름
private int money; //돈
public User2(String name, int money){
this.name = name;
this.money = money;
}
public String getName() { return name; }
public int getMoney() { return money; }
public void setName(String name) { this.name = name; }
public void setMoney(int money) { this.money = money; }
}
import java.util.*;
public class AccountMap {
public static void main(String[] args) {
Map<String,User2> bank = new HashMap<>();
Scanner sc = new Scanner(System.in);
String account = "";
String name = "";
int money = 0;
stop : while(true) {
System.out.println("-----------------------------------------------");
System.out.println("1.계좌추가 | 2.계좌확인 | 3.계좌입금 | 4.계좌출금 | 5.전체계좌확인 | 6.종료");
System.out.println("-----------------------------------------------");
System.out.print("입력>");
int choice = sc.nextInt();
switch(choice) {
case 1 :
System.out.print("계좌번호>");
account = sc.next();
System.out.print("계좌주>");
name = sc.next();
System.out.print("초기입금액:");
money = sc.nextInt();
if(bank.containsKey(account)) {
System.out.println("계좌가 중복되어 개설되지 못했습니다.");
}else {
bank.put(account, new User2(name,money));
System.out.println("계좌가 개설되었습니다.");
}
break;
case 2 :
System.out.print("계좌번호>");
account = sc.next();
if(bank.containsKey(account)) {
System.out.println("존재하는 계좌번호 입니다.");
}else {
System.out.println("존재하지 않는 계좌번호입니다.");
}
break;
case 3 :
System.out.print("계좌번호>");
account = sc.next();
if(bank.containsKey(account)) {
money = bank.get(account).getMoney();
System.out.print("입금액>");
bank.get(account).setMoney(money + sc.nextInt());
System.out.println(bank.get(account).getName() + "님의 "
+ account +" 계좌에 "
+ money +"원이 입금되어 잔액은 "
+ bank.get(account).getMoney() +"원입니다.");
}else {
System.out.println("존재하지 않는 계좌번호입니다.");
}
break;
case 4 :
System.out.print("계좌번호>");
account = sc.next();
System.out.print("출금액>");
money = sc.nextInt();
if(bank.containsKey(account)) {
if(money <= bank.get(account).getMoney()) {
bank.get(account).setMoney(bank.get(account).getMoney() - money);
System.out.println(bank.get(account).getName() + "님의 "
+ account +" 계좌에 "
+ money +"원이 출금되어 잔액은 "
+ bank.get(account).getMoney() +"원입니다.");
}else {
System.out.println(bank.get(account).getName() + "님의 "+ account +"계좌 잔액부족입니다.");
}
}else {
System.out.println("존재하지 않는 계좌번호입니다.");
}
break;
case 5 :
System.out.println("[전체 계좌]");
Set<String> mSet = bank.keySet();
for(String user : mSet) {
System.out.println(user +" "+ bank.get(user).getName() +" "+bank.get(user).getMoney());
}
break;
case 6 :
System.out.println("프로그램 종료");
break stop;
default : System.out.println("잘못입력하셨습니다."); break;
}
}
sc.close();
}
}
1.키는 문자열 값은 정수인 map을 선언(인터페이스 명은 map1)
Map<String,Integer> map1 = new HashMap<>();
2.문제 1에서 선언한 map에 아래 데이터를 추가후 map의 원소 갯수를 출력
"apple" , 1000
"banana" , 2000
"orange" , 1500
"apple" , 2000
"lemon" , 2500
map1.put("apple", 1000);
map1.put("banana", 2000);
map1.put("orange", 1500);
map1.put("apple", 2000);
map1.put("lemon", 2500);
System.out.println("map1의 원소 갯수:"+map1.size()); //4
3.문제 2의 map에서 값이 2000 이상인 원소의 갯수를 출력하세요
Iterator
Set<String> mSet = map1.keySet();
Iterator<String> mIterator = mSet.iterator();
int count = 0;
while(mIterator.hasNext()) {
String key = mIterator.next();
int value = map1.get(key);
if(value >= 2000) {
count++;
}
}
향상된 for문
Set<String> mSet = map1.keySet();
count = 0;
for(String key : mSet) {
int value = map1.get(key);
if(value >= 2000) {
count++;
}
}
4. 학번을 키로 학생명, 나이, 연락처, 주소를 담은 객체를 값으로 하는 map을 선언
map의 이름은 studentMap
학번은 문자열로 다룹니다
Map<String,Student2> studentMap = new HashMap<>();
5.문제 4에서 선언한 map에 아래 데이터를 추가하세요
001 : "홍길동",30,"010-0000-0000","전주 덕진구"
002 : "김길동",20,"010-0000-1111","인천 서구"
003 : "이길동",33,"010-0000-2222","안양 만안구"
004 : "박길동",26,"010-0000-3333","대전 유성구"
005 : "고길동",37,"010-0000-4444","서울 성북구"
studentMap.put("001",new Student2("홍길동",30,"010-0000-0000","전주 덕진구"));
studentMap.put("002",new Student2("김길동",20,"010-0000-1111","인천 서구"));
studentMap.put("003",new Student2("이길동",33,"010-0000-2222","안양 만안구 "));
studentMap.put("004",new Student2("박길동",26,"010-0000-3333","대전 유성구"));
studentMap.put("005",new Student2("고길동",37,"010-0000-4444","서울 성북구"));
6.문제 5번에서 추가한 map에서 학번이 005인 학생의 모든 정보를 출력하세요
Set<String> sSet = studentMap.keySet();
Iterator<String> sIt = sSet.iterator();
while(sIt.hasNext()) {
String key = sIt.next();
if(key.equals("005")) {
System.out.print(studentMap.get(key).getName() + " ");
System.out.print(studentMap.get(key).getAge() + " ");
System.out.print(studentMap.get(key).getTel() + " ");
System.out.println(studentMap.get(key).getAddr());
}
}
Student2 s = studentMap.get("005");
System.out.println(s.getName()+","+ s.getAge()+","+s.getTel()+","+s.getAddr());
7.문제 5번에서 추가한 map에서 학생들의 평균 나이를 출력하세요
int ageSum = 0;
Iterator<String> sIt2 = sSet.iterator();
while(sIt2.hasNext()) {
String key = sIt2.next();
ageSum += studentMap.get(key).getAge();
}
System.out.println("학생들의 평균 나이:" + ageSum/studentMap.size());
'Java' 카테고리의 다른 글
[JSP]모델 1 (0) | 2024.10.05 |
---|---|
[Java] 람다식 (2) | 2024.08.27 |
[Java] set 연습 (0) | 2024.08.24 |
[Java] Set, Iterator (0) | 2024.08.22 |
[Java] ArrayList, List 연습 (0) | 2024.08.21 |