해시(Hash)

호수·2024년 10월 9일
0

JAVA 알고리즘

목록 보기
17/67
post-thumbnail
post-custom-banner

1. HashSet이란?

HashSet은 Java에서 제공하는 집합(Set) 자료구조로, 중복된 요소를 허용하지 않으며 순서를 유지하지 않는 특징을 가지고 있습니다. HashSet은 해시 기반으로 동작하여 매우 빠른 검색, 삽입, 삭제 작업이 가능합니다.

HashSet 주요 기능 정리

1.HashSet 선언

HashSet set = new HashSet<>();

2.초기값 지정

HashSet set = new HashSet<>(Arrays.asList("tiger", "lion", "fox"));

3.요소 추가

set.add("rabbit");
add() 메서드를 사용하여 새로운 요소를 HashSet에 추가합니다. 중복된 값은 허용되지 않으며 추가되지 않습니다.

4.크기 확인

set.size();

5.요소 제거

set.remove("fox");

6.모든 요소 제거

set.clear();

7.요소 포함 여부 확인

set.contains("lion");

contains() 메서드를 사용하여 특정 요소가 HashSet에 포함되어 있는지 확인합니다. 포함되어 있으면 true, 그렇지 않으면 false를 반환합니다.

8.요소 값 출력

System.out.println(set);

HashSet 자체를 출력하면 요소들이 출력됩니다. (출력 순서는 저장 순서와 다를 수 있습니다.)

9.Iterator 사용하여 요소 순회

Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
Iterator를 사용하여 HashSet의 요소를 순차적으로 순회할 수 있습니다.

  • hasNext()는 가져올 요소가 있으면 true, 없으면 false를 반환합니다.
  • next()는 다음 요소를 반환합니다.

2. HashMap이란?

HashMap은 데이터를 저장할 때 키(Key)와 밸류(Value)가 짝을 이루어 저장됩니다. 데이터를 저장할 때는 키(Key) 값으로 해시함수를 실행한 결과를 통해 저장위치를 결정합니다. 따라서 HashMap은 특정 데이터의 저장위치를 해시함수를 통해 바로 알 수 있기 때문에 데이터의 추가, 삭제, 특히 검색이 빠르다는 장점이 있습니다. 
이러한 이유로 HashMap은 키(Key)값을 통해서만 검색이 가능하며, HashMap의 키(Key) 값은 중복될 수 없고, 밸류(Value) 값은 키(Key) 값이 다르다면 중복이 가능합니다. 

1) HashMap 생성 및 실행
public class HelloWorld {
	public static void main(String[] args) {
		HashMap<String, String> h1 = new HashMap<String, String>();
		HashMap<String, String> h2 = new HashMap<String, String>();
		
		h1.put("aaa", "1111");
		h1.put("bbb", "2222");
		h1.put("ccc", "3333");
		h1.putIfAbsent("aaa", "0000");
		h1.putIfAbsent("ddd", "4444");
		h2.putAll(h1);
		System.out.println("h1 : " + h1);
		System.out.println("h2 : " + h2);
		
		System.out.println("[1]: " + h1.containsKey("aaa"));
		System.out.println("[2]: " + h1.containsValue("1111"));
		System.out.println("[3]: " + h1.isEmpty());
		System.out.println("[4]: " + h1.size());
		System.out.println("[5]: " + h1);
		System.out.println("[6]: " + h1.remove("aaa", "1111"));
		System.out.println("[7]: " + h1.put("bbb", "0000"));
		System.out.println("[8]: " + h1.replace("ccc", "0000"));
		System.out.println("h1 : " + h1);
		System.out.println("h2 : " + h2);
				
		
		for (String key: h1.keySet()) {
			String value = h1.get(key);
			System.out.println("Key:" + key + ", Value:" + value);	
		}
	}
}
 
2) 실행결과
h1 : {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
h2 : {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
[1]: true
[2]: true
[3]: false
[4]: 4
[5]: {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
[6]: true
[7]: 2222
[8]: 3333
h1 : {ccc=0000, bbb=0000, ddd=4444}
h2 : {aaa=1111, ccc=3333, bbb=2222, ddd=4444}
Key:ccc, Value:0000
Key:bbb, Value:0000
Key:ddd, Value:4444

알고리즘 문제나 로직을 짜다보면 가끔 순서가 보장되는 HashMap이 필요한 상황이 온다. 그럴 때 사용하는 것이 LinkedHashMap이다.

LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>(); 

정렬

Java에서 HashMap 정렬이 필요할 때, 그 방법에 대해 알아볼 것이다.

정렬 기준은 key, value 두가지로 나눌 수 있다.

1. Key 값을 기준으로 정렬하기

map 의 keySet을 이용하여 정렬한다.
오름차순 시에는 Collection.sort(), 내림차순 시에는 Collection.reverse() 메소드를 사용하여 정렬한다.

import java.util.*;

public class Sort {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();

        map.put("A", 10);
        map.put("D", 30);
        map.put("C", 20);
        map.put("B", 40);


        List<String> keySet = new ArrayList<>(map.keySet());

        // 키 값으로 오름차순 정렬
        Collections.sort(keySet);

        for (String key : keySet) {
            System.out.print("Key : " + key);
            System.out.println(", Val : " + map.get(key));
        }
       
        /*  결과
            Key : A, Val : 10
            Key : B, Val : 40
            Key : C, Val : 20
            Key : D, Val : 30
         */
        
        

        // 키 값으로 내림차순 정렬
        Collections.reverse(keySet);

        for (String key : keySet) {
            System.out.print("Key : " + key);
            System.out.println(", Val : " + map.get(key));
        }
        
        /*  결과
            Key : D, Val : 30
            Key : C, Val : 20
            Key : B, Val : 40
            Key : A, Val : 10
        */
	}
}

2.Value 값을 기준으로 정렬하기

Value 값을 기준으로 정렬할 때는 comparator를 사용하여 정렬한다.

comparator는 람다 표현식으로 간단하게 표현할 수도 있다.

import java.util.*;

public class Sort {

    public static void main(String[] args) {

		Map<String, Integer> map = new HashMap<>();

        map.put("A", 10);
        map.put("D", 30);
        map.put("C", 20);
        map.put("B", 40);


        List<String> keySet = new ArrayList<>(map.keySet());

        // Value 값으로 오름차순 정렬
        keySet.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return map.get(o1).compareTo(map.get(o2));
            }
        });

        for (String key : keySet) {
            System.out.print("Key : " + key);
            System.out.println(", Val : " + map.get(key));
        }

        /*
            결과
            Key : A, Val : 10
            Key : C, Val : 20
            Key : D, Val : 30
            Key : B, Val : 40
         */

        // Value 값으로 내림차순 정렬
        // 위 comparator 람다 표현식으로
        keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));

        for (String key : keySet) {
            System.out.print("Key : " + key);
            System.out.println(", Val : " + map.get(key));
        }

        /* 결과
            Key : B, Val : 40
            Key : D, Val : 30
            Key : C, Val : 20
            Key : A, Val : 10
         */
	}
}
profile
Back-End개발자 성장과정 블로그🚀
post-custom-banner

0개의 댓글