본문 바로가기

JAVA

HashMap

HashMap이란?

키(Key)와 값(Value)을 묶어서 하나의 데이터(Entry)로 저장

순서 X / 키는 중복 X / 값은 중복 O

만약, 순서를 유지하고 싶다면 LinkedHashMap을 사용해라.

 

해싱 기법을 사용하기 때문에 많은 양의 데이터를 검색하는데 유리

왜 빠르다고 하는지? 배열의 인덱스를 값으로 출력하여 찾기 쉬움. 서랍 정리 해놓았다고 생각하자.

 

예를 들어, 주민번호 880101-2xxxxxx의 사람의 정보가 담긴 서랍을 찾아야 한다고 가정하자.

880101-2xxxxxx이 해시 함수를 거쳐 8이라는 인덱스를 출력했다면, 그 8이라는 인덱스만 찾으면 되므로 빠르게 찾을 수 있다.

 


 

아이디와 비밀번호를 저장하고 출력하는 예제

아이디를 key, 비밀번호를 value로 저장

 

put(Object key, Object value) : 지정된 키와 값을 저장. Object 타입으로 어떤 자료형이든 들어갈 수 있음.

containsKey(Object key) : HashMap에 지정된 키가 포함되어 있는지 

containsValue(Object value) : HashMap에 지정된 값이 포함되어 있는지 

get(Object key) : 지정된 키의 값을 반환. 못찾으면 null 반환

 

getOrDefault(Object key, Object defaultValue)

지정된 키의 값을 반환한다. 키를 못찾으면, 기본값으로 지정된 객체를 반환한다.

ex) getOrDefault("qwer", "0000") -> "1234"; // qwer은 있으므로 이에 맞는 1234 반환

      getOrDefault("zzzz", "1212") -> "1212"; // zzzz는 없으므로 지정된 1212 반환

 

package java11;

import java.util.HashMap;
import java.util.Scanner;

public class Ex11_16 {

	public static void main(String[] args) {
		
		HashMap<String, String> map = new HashMap<String, String>();
		
		// 값을 저장
		map.put("qwer", "1234");
		map.put("asdf", "1234");
		map.put("asdf", "1111");
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println("id와 pw를 입력해주세요.");
		
		System.out.printf("id: ");
		String id = scan.nextLine();
		
		System.out.printf("pw: ");
		String pw = scan.nextLine();
		
		if(map.containsKey(id)) { // map에 사용자가 입력한 id가 들어있니?
        
			// 사용자가 입력한 id의 value(=pw)를 반환한 값이, 사용자가 입력한 pw랑 일치하니?
			if(map.get(id).equals(pw)) {
				System.out.println("id와 pw가 일치합니다.");
			} else {
				System.out.println("id와 pw가 일치하지 않습니다.");
			}
		} else {
			System.out.println("존재하지 않는 id입니다.");
		}


	}

}

 

 

학생들의 점수를 입력받아 평균, 최고점, 최저점을 구하는 예제

이름을 Key, 점수를 Value로 저장

 

Set entrySet()

HashMap에 저장된 키와 값을 엔트리 형태로 set에 저장해서 반환

키와 값을 함께 얻고 싶을 때는 Map을 Set 형태로 변환해서 가져와야함 (반환 형태가 Set인 것 확인해라)

 

Set keySet() : HashMap에 저장된 key 값만 반환

Collection values() : HashMap에 저장된 value 값만 반환

 

remove(Object key) : 지정된 키로 저장된 값을 제거

replace(Object key, Object value) : 지정된 키의 값을 지정된 value로 대체

replace(Object key, Object oldValue, Object newValue) : 지정된 키와 oldValue가 일치하는 경우에만 값을 newValue로 대체

 

package java11;

import java.util.*;

public class Ex11_17 {

	public static void main(String[] args) {
		
		HashMap<String, Integer> map = new HashMap<String, Integer>();
		
		map.put("안자바", 90);
		map.put("김자바", 100);
		map.put("강자바", 80);
		map.put("이자바", 100);
		
		// 전체 목록 출력하기
		Set set = map.entrySet();
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			Map.Entry e = (Map.Entry)it.next();
			System.out.println("이름:" + e.getKey() + " 점수:" + e.getValue());
		}
		
		// key 값만 가져오기
		set = map.keySet();
		System.out.println("참가자 명단: " + set);
		
		// value의 총점 구하기
		Collection values = map.values(); // map의 values 값을 모두 들고와
		it = values.iterator(); // 모두 들고온 값을 it이라고 정의하자?
		
		int total = 0;
		
		while(it.hasNext()) {
			total = total + (Integer)it.next(); // it을 돌면서 값을 더해줘
		}
		
		System.out.println("총점: " + total);
		System.out.println("평균: " + (float)total/set.size()); // 저장된 요소의 갯수
       
		// 컬렉션 클래스에 있는 max, min 메서드
		System.out.println("최고점수: " + Collections.max(values)); 
		System.out.println("최고점수: " + Collections.min(values));
	}

}

 

 

단어, 빈도 수 카운트 예제

 

package java11;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Ex11_18 {

	public static void main(String[] args) {
		
		String[] data = { "A", "K", "A", "K", "D", "K", "A", "K", "K", "K", "Z", "D" };
		
		HashMap map = new HashMap();
		
		for(int i = 0; i < data.length; i++) {
			
			if(map.containsKey(data[i])) { // map의 key에 겹치는 문자가 있다면
				
				// key가 data[i]인 요소의 값을 가져와서 value에 저장
				Integer value = (Integer) map.get(data[i]); 
				
				// map의 key data[i]에 value 값을 1 증가시켜 저장
				map.put(data[i], new Integer(value.intValue() + 1)); // map.put(data[i], value + 1);
				
				
			} else { // map의 key에 겹치는 문자가 없다면
				
				// key에는 문자를 저장, value에는 1을 저장해라
				map.put(data[i], new Integer(1)); // map.put(data[i], 1);
				
			}
			
		}
		
		Iterator it = map.entrySet().iterator();
		
		while(it.hasNext()) {
			Map.Entry entry = (Map.Entry)it.next();
			int value = ((Integer)entry.getValue()).intValue();
			System.out.println(entry.getKey() + " : " + printBar('#', value) + " " + value);
		}
		
		
	}

	public static String printBar(char ch, int value) {
		
		char[] bar = new char[value];
		
		for(int i = 0; i < bar.length; i++) {
			bar[i] = ch;
		}
		
		return new String(bar);
		
	}
}

/*
	A : ### 3
	D : ## 2
	Z : # 1
	K : ###### 6
*/

 

'JAVA' 카테고리의 다른 글

Collection 클래스 정리  (0) 2021.01.10
Collections  (0) 2021.01.10
TreeSet  (0) 2021.01.07
HashSet  (0) 2020.12.29
Arrays 클래스  (0) 2020.12.23