Java/객체지향

[객체지향][자바의 정석] - 22. HashMap

얄루몬 2022. 2. 13. 20:53

https://youtu.be/el6cTtPHVRs?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


1. HashMap의 주요메서드

 

 

 

 

2.실습

[HashMap을 사용하여 id와 password를 key와 value를 사용해서 찾는 코드]

package javajungsuk;

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

public class Ex11_16 {

	public static void main(String[] args) {
		HashMap map = new HashMap();
		map.put("myId","1234");
		map.put("asdf","1111");
		map.put("asdf","1234");

		
		Scanner s = new Scanner(System.in); // 화면으로부터 라인 단위로 입력 받는
		
		while(true) {
			System.out.println("id와 password를 입력해주세요.");
			System.out.print("id :");
			String id = s.nextLine().trim();
			
			System.out.print("password : ");
			String password = s.nextLine().trim(); //앞뒤공백제거
			System.out.println();
			
			if(!map.containsKey(id)) {
				System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
				continue;
			}
			if(!(map.get(id)).equals(password)) {
				//get(id) --> 그 아이디에 해당하는 value를 반환
				System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
			} else {
				System.out.println("id와 비밀번호가 일치합니다.");
				break;
			}
		}
	
	}

}

 

[ HashMap으로 총점, 평균, 최고점수, 최저점수 찾는 코드 ]

package javajungsuk;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Ex11_17 {
	public static void main(String[] args) {
		HashMap map = new HashMap();
		map.put("김자바",new Integer(90));
		map.put("이자바",new Integer(100));
		map.put("김자바",new Integer(100));
		map.put("강자바",new Integer(90));
		map.put("안자바",new Integer(80));
		
		
		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());
		}
		set = map.keySet();
		System.out.println("참가자 명단: "+set);
		
		Collection values = map.values();
		it = values.iterator();
		
		int total = 0;
		
		
		while(it.hasNext()) {
			int i = (int)it.next();
			total += i;
		}
		System.out.println("총점 : "+total);
		System.out.println("평균 : "+(float)total/set.size());
		System.out.println("최고점수 : "+ Collections.max(values));
		System.out.println("최저점수 : "+ Collections.min(values));
	}
	

}

 

[HashMap을 이용해서 그래프를 표현해보기]

package javajungsuk;

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

import java.util.*;
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])) {
				int value = (int)map.get(data[i]);
				map.put(data[i],value+1);
			} else { //key가 들어있지 않으면 그대로 ket 넣어주고 value 1로 넣어줌
				map.put(data[i], 1);
			}
		}
		Iterator it = map.entrySet().iterator();
		
		while(it.hasNext()) {
			Map.Entry entry = (Map.Entry)it.next();
			int value = (int)entry.getValue();
			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);
	}
}

 

 

 

3. 해싱(Hashing)이란?

  • 해시함수를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법으로 해시함수는 데이터가 저장되어 있는 곳을 알려주기 때문에 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다.

 

  • 이를 구현한(해싱을 구현한) 컬렉션 클래스로는 HashSet, HashMap, HashTable등이 있다.

 

  • 해싱에 사용하는 자료구조는 배열과 Linked List의 조합으로 이루어져 있다. 저장할 데이터의 키를 해시함수에 넣으면 배열의 한 요소를 얻게 되고, 다시 그 곳에 연결되어 있는 Linked List에 저장하게 된다.

 

데이터를 찾는 과정은 아래와 같다.

  • 검색하고자 하는 값의 키로 해시함수를 호출한다.
  • 해시 함수의 결과인 해시코드를 이용해 해당 값이 저장되어 있는 Linked List를 찾는다.
  • Linked List에서 검색하는 키와 일치하는 데이터를 찾는다.