organize/자바

Java 27

001cloudid 2024. 5. 14. 17:09
728x90

HashMap

순서가 없고, 키는 중복이 안되고 값은 중복이 가능

  • Map 인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장
  • HashMap(동기화X), Hashtable(동기화O)의 새로운 버전

HashMap

  • Map인터페이스를 구현한 대표적인 컬렉션 클래스
  • 순서를 유지하려면, LinkedHashMap클래스를 사용하면 됨

TreeMap≒TreeSet

  • 범위 검색과 정렬에 유리한 컬렉션 클래스
  • HashMap보다 데이터 추가, 삭제에 시간이 더 걸림(비교 저장)

HashMap의 키(key)와 값(value)

  • 해싱(hashing)기법으로 데이터를 저장. 데이터가 많아도 검색이 빠름
  • Map인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장
    키(key) 컬렉션 내의 키(key) 중에서 유일(ex, id)
    값(value) 키(key)와 달리 데이터의 중복을 허용(ex, pw)
		 HashMap hashMap = new HashMap();
		 hashMap.put("id1","1234");
		 hashMap.put("id2","4567");
		 hashMap.put("id2","1234");
//		 	키	값
//		 	id1 1234
//		 	id2 1234(덮어씀)

 

해싱(hashing)

  • key값을 넣으면 배열의 index(저장위치 => hashCode)를 알려줌
    즉, 해시함수를 이용해서 저장하고 읽어 오기
  • 해시함수(hash function)로 해시테이블(hash table)에 데이터를 저장, 검색
  • 해시테이블은 배열과 링크드 리스트가 조합된 형태(2차원 배열, 링크드 리스트를 배열로 묶은것(변경이 쉽게))
    해시테이블 : 배열의 장점 접근성, 링크드 리스트 변경 유리
  • 해시테이블에 저장된 데이터를 가져오는 과정
    ⓐ키로 해시함수를 호출해서 해시코드를 얻음
    ⓑ해시코드(해시함수의 반환값)에 대응하는 링크드 리스트를 배열에서 찾음
    ⓒ링크드리스트에서 키와 일치하는 데이터를 찾음
    ※해시함수는 같은 키에 대해 항상 같은 해시코드를 반환해야함
    서로 다른 키일지라도 같은 값의 해시코드를 반환할 수 있음

HashMap 주요 메서드

해시테이블 = 배열 + 링크드리스트

  • HashMap() : 생성자
  • HashMap(int initialCapacity) : 배열 초기용량
  • HashMap(int initialCapacity, float loadFactor) : 배열 초기용량
  • HashMap(Map m)
  • Object put(Object key, Object value)
  • void putAll(Map m)
  • Object remove(Object key)
  • Object replace(Object key, Object value)
  • boolean replace(Object key, Object oldValue, Object newValue)
  • Set entrySet()
  • Set keySet()
  • Collection values()
  • Object get(Object key)
  • Object getOrDefault(Object key, Object defaultValue)
  • boolean containsKey(Object key)
  • boolean containsValue(Object value)
  • int size()
  • boolean isEmpty()
  • void clear()
  • Object clone()

 

package chapter11;

import java.util.*;

public class Study11Ex1 {

	public static void main(String[] args) {

		HashMap map = new HashMap();
		map.put("id1", "1234");
		map.put("id2", "1234");
		map.put("id2", "0000");
		
		Scanner sc = new Scanner(System.in);
		System.out.println("id와 pw를 입력");
		while (true) {
			System.out.println("id : ");
			String id = sc.nextLine().trim();
			
			System.out.println("pw : ");
			String pw = sc.nextLine().trim();
			System.out.println();
			
			if(!map.containsKey(id)) {
				System.out.println("입력한 id는 존재하지 않음. 다시 입력");
				continue;
			}
			if(!(map.get(id)).equals(pw)) {
				System.out.println("pw 불일치. 다시 입력");
			} else {
				System.out.println("id와 pw 일치. 프로그램 종료합니다.");
				break;
			}
			
		}
		
		
	}

}

 

package chapter11;

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 Study11Ex2 {

	public static void main(String[] args) {
		
		HashMap map = new HashMap();
		map.put("태조", 60);
		map.put("태조", 70);
		map.put("정종", 40);
		map.put("태종", 90);
		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());
		}
		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));

	}

}

 

package chapter11;

import java.util.*;

public class Study11Ex3 {
	
	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); 	// String(char[] chArr)
	}

	public static void main(String[] args) {

		String[] data = {"A","B","A","B","C","B","A","B","B","D","F"};
		
		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 {
				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);
		}
		
	}

}

 

Collections

컬렉션을 위한 메서드(static)를 제공

  • 컬렉션 채우기 - fill(), 복사 - copy(), 정렬 - sort(), 검색 - binarySearch() 등
  • 컬렉션 동기화 - synchronizedXXXX()
  • 변경불가(readOnely, 수정불가) 컬렉션 만들기 - unmodifiableXXXX()
  • 싱글톤 컬렉션 만들기(객체 1개만 저장) - singletonXXXX()
  • 한 종류의 객체만 저장하는 컬렉션 만들기 - checkedXXXX()
package chapter11;

import java.util.ArrayList;
import java.util.Collections; //import static java.util.Collections; 로 작성 시 Collections를 생략 가능하게 해줌
import java.util.Enumeration;
import java.util.List;

public class Study12Ex1 {
	
	public static void main(String[] args) {

		List list = new ArrayList();
		System.out.println(list);
		
		Collections.addAll(list,1,2,3,4,5);
		System.out.println(list); //[1,2,3,4,5]
		
		Collections.rotate(list,2); //반시계 방향으로 두번 회전
		System.out.println(list); //[4,5,1,2,3]
		
		Collections.swap(list, 0, 2); //2번째 인수와 3번째 인수 교환
		System.out.println(list); //[1,5,4,2,3]
		
		Collections.shuffle(list); //저장된 요소의 위치를 임의로 변경
		System.out.println(list);
		
		Collections.sort(list,Collections.reverseOrder()); //역순 정렬 reverse(list)와 동일
		System.out.println(list); //[3,2,4,5,1]
		
		Collections.sort(list); //정렬
		System.out.println(list); //[1,2,3,4,5]
		
		int idx = Collections.binarySearch(list, 3); //두번째 인자(저장된위치(index))를 반환. ※binarySearch를 할 때 정렬이 먼저 되어있어야함
		System.out.println(idx); //2
		
		System.out.println("max = " + Collections.max(list));
		System.out.println("min = " + Collections.min(list));
		System.out.println("min(reverseOrder) =" + Collections.min(list,Collections.reverseOrder()));
		
		Collections.fill(list, 0); //list를 0으로 채움
		System.out.println(list);
		
		List newList = Collections.nCopies(list.size(), 2); //list와 같은 크기의 새로운 list를 생성하고 2로 채움. 단 결과는 변경불가
		System.out.println("newList = " + newList);
		
		System.out.println(Collections.disjoint(list, newList)); //공통요소가 없으면 true
		
		Collections.copy(list, newList);
		System.out.println("newList = " + newList);
		System.out.println("list = " + list);
		
		Collections.replaceAll(list, 2, 1); //두번째 인자를 세번째인자로 교체
		System.out.println("list = " + list);
		
		Enumeration e = Collections.enumeration(list); //enumeration==iterator
		ArrayList list2 = Collections.list(e);
		System.out.println("list2 = " + list2);
		
	}

}

 

728x90

'organize > 자바' 카테고리의 다른 글

Java 29  (0) 2024.08.13
Java 28  (0) 2024.05.16
Java 26  (0) 2024.05.13
Java 25  (0) 2024.05.11
Java 24  (0) 2024.05.09