HashSet은 Java에서 제공하는 집합(Set) 자료구조로, 중복된 요소를 허용하지 않으며 순서를 유지하지 않는 특징을 가지고 있습니다. 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()는 다음 요소를 반환합니다.
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 두가지로 나눌 수 있다.
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
*/
}
}
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
*/
}
}