package ex_map;
import java.util.*;
import java.util.Map.*;
public class Ex1 {
public static void main(String[] args) {
/*
* Map 계열
*
*/
Map map = new HashMap();
// put(Object key, Object value) : key에 해당하는 위치에 value 저장
map.put(1, "Java"); // 정수 1에 해당하는 키에 문자열 "Java" 값 저장
map.put(2, "JSP");
map.put(3, "Android");
System.out.println("map 객체의 모든 키와 값 출력 : " + map);
// 중복되는 키를 사용하여 다른 값을 저장하는 경우
// map.put(3, "Oracle"); // 정수 3에 해당하는 키에 문자열 "Oracle" 값 저장
// => 기존에 3번 키가 존재하므로 "Android"값을 제거하고, "Oracle"값 저장(덮어쓰기)
// 이 때, 제거되는 "Android"값 Object 타입으로 리턴됨
System.out.println("3번 키에 Oracle 문자열 저장 : " + map.put(3, "Oracle"));
System.out.println("map 객체의 모든 키와 값 출력 : " + map);
// 새로운 키에 중복된 값을 저장하는 경우
map.put(4, "JSP");
System.out.println("map 객체의 모든 키와 값 출력 : " + map);
// Object get(Object key) : key에 해당하는 value 리턴
// => key가 존재하지 않으면 null값 리턴됨
System.out.println("정수 2에 해당하는 키의 데이터 : " + map.get(2)); // JSP
System.out.println("정수 6에 해당하는 키의 데이터 : " + map.get(6)); // null
// Set keySet() : Map 객체 내의 모든 키 리턴
// => Set 타입 변수에 저장하거나 Set 타입 객체 형토로 직접 사용 가능
System.out.println("map 객체 내의 모든 키 : " + map.keySet());
// Collection values() : Map 객체 내의 모든 값 리턴
// => Set 타입 또는 List 타입 등의 변수에 할당 불가능(다운캐스팅 X)
System.out.println("map 객체 내의 모든 값 : " + map.values());
// Set values = (Set) map.values(); // 다운캐스팅 시 예외 발생!
// List values = (List) map.values();
// Set 또는 List 계열 객체 생성 시 파라미터로 전달하여 객체 변환 가능
// List values = new ArrayList(map.values());
Set values = new HashSet(map.values());
// => 만약, 중복된 값이 존재할 경우 Set 타입으로 관리하면 중복이 제거되므로 주의!
System.out.println("map 객체(map->set) 내의 모든 값 : " + values);
// Set entrySet() : 키와 값을 한 쌍으로 갖는 Map.Entry 객체의 모임
// => 키와 값의 한 쌍이 다른 키와 값의 한 쌍과 중복될 수 없으므로 Set 타입으로 관리됨
Set entrySet = map.entrySet();
System.out.println(entrySet);
System.out.println("map 객체가 비어있는가? " + map.isEmpty());
System.out.println("map 객체에 저장된 요소 갯수 : " + map.size());
// 요소를 제거하는 remove() 메서드는 2가지로 제공됨
// Object remove(Object key) : key에 해당하는 요소(key, value) 제거
System.out.println("4번 key에 해당하는 요소 제거 : " + map.remove(4));
System.out.println("map 객체의 모든 키와 값 출력 : " + map);
// 만약, 존재하지 않는 키를 지정할 경우 : null 값 리턴됨
System.out.println("4번 key에 해당하는 요소 제거 : " + map.remove(4));
System.out.println("map 객체의 모든 키와 값 출력 : " + map);
// boolean remove(Object key, Object value) : key와 value 모두 일치하는 요소 제거
System.out.println("3번 key의 Oracle 값에 해당하는 요소 제거 : " + map.remove(3, "Oracle"));
System.out.println("map 객체의 모든 키와 값 출력 : " + map);
// 만약, 키와 값이 일치하지 않거나 존재하지 않는 키를 지정할 경우 false 리턴됨
System.out.println("3번 key의 Oracle 값에 해당하는 요소 제거 : " + map.remove(3, "Oracle"));
System.out.println("2번 key의 Java 값에 해당하는 요소 제거 : " + map.remove(2, "Java"));
System.out.println("map 객체의 모든 키와 값 출력 : " + map);
System.out.println("============================================");
/*
* HashMap 객체(map2) 생성 후 다음 요소 추가
*
* key Value
* "010-1234-5678" "홍길동"
* "010-2222-2222" "이순신"
* "010-3333-3333" "강감찬"
*
*/
Map map2 = new HashMap();
map2.put("010-1234-5678", "홍길동");
map2.put("010-2222-2222", "이순신");
map2.put("010-3333-3333", "강감찬");
System.out.println(map2);
System.out.println("================================");
// Map 객체 반복하는 방법
// 향상된 for문 / Iterator(반복자)
// ex) 이름 : XXX, 전화번호 : XXX
// 향상된 for문
Set keySet = map2.keySet(); // 키값만 리턴받은 Set 객체
for (Object phone : keySet) {
System.out.println("이름 : " + map2.get(phone) + ", 전화번호 : " + phone);
}
System.out.println("===============");
// Iterator
// => Map 객체의 ketSet() 메서드를 호출하여 모든 키를 꺼낸 다음
// 해당 Key가 저장된 Set 객체의 iterator() 메서드를 호출하여 Iteratro 객체 리턴받아 사용
Set keySet2 = map2.keySet(); // 키값만 리턴받은 Set 객체
Iterator iterator = keySet2.iterator();
while (iterator.hasNext()) { // 다음 요소가 존재할 때까지 반복
String phone = (String) iterator.next();
String name = map2.get(phone).toString();
System.out.println("이름 : " + name + ", 전화번호 : " + phone);
}
// key를 사용하지 않고, Map.Entry 객체를 통해 반복
Set entrySet2 = map2.entrySet(); // 모든 엔트리 가져오기(-> Set)
Iterator entryIterator = entrySet2.iterator();
while (entryIterator.hasNext()) {
// 엔트리 1개 꺼내서 Map.Entry 타입 변수에 저장(형변환 필요)
Map.Entry entry = (Entry) entryIterator.next();
// 1개 엔트리에서 getXXX() 메서드를 호출하여 각가의 키, 값 가져오기
System.out.println("이름 : " + entry.getValue() + ", 전화번호 : " + entry.getKey());
}
// boolean containsKey(Object key) : 해당 key의 존재 여부 리턴
// boolean containsValue(Object value) : 해당 value의 존재 여부 리턴
System.out.println("010-1234-5678 전화번호가 존재가하는가? " + map2.containsKey("010-1234-5678"));
System.out.println("010-1234-5678 전화번호가 존재가하는가? " + map2.containsValue("010-1234-5678"));
System.out.println("홍길동 이름이 존재하는가? " + map2.containsValue("홍길동"));
// 모든 키와 값을 초기화
// => void clear()
map2.clear();
System.out.println(map2);
}
}