집합(Set)
*(hash) Set
-중복 항목이 존재하지 않는 컬렉션
-테이블에 가까운 자료구조
-Set 인터페이스를 상속함.
-해시함수를 통해 데이터의 저장위치를 참조
-동일 항목의 경우, 같은 위치를 참조하기 때문에 중복된 값이 생길 수 없음.
-해싱 연산(hash function)만 이루어지면 바로 데이터에 바로 접근가능하여 접근 속도가 매우 빠름.
-데이터 추가/삭제 또한 LinkedList보다는 느리지만 배열보다는 빠르게 수행함.
*HashSet은 입력순서를 유지하지 않음. (요소들의 위치에 대해 신경쓰지 않음.) => 출력 시, 데이터의 순서가 다를 수 있음.
but, LinkedHashSet이나 TreeSet을 활용할 경우 입력순서를 유지 시키거나 데이터를 정렬할 수 있음.
-LinkedHashSet : 입력 순서를 유지 시킴.
-TreeSet : 데이터를 정렬 시킴.
*2023.09.04
*TreeSet에서만 사용할 수 있는 작업들
-TreeSet은 NavigableSet 인터페이스를 구현하기 때문에 그 메서드들을 사용할 수 있다.
- .floor(value) : value 이하의 값을 반환
- .lower(value) : value 미만의 값을 반환
- .ceiling(value) : value 이상의 값을 반환
- .higher(value) : value 초과의 값을 반환
- .subSet(value1, value2) : value1이상, value2 미만의 값을 반환
=> (true/false를 통해 value를 포함할지 안할지 설정할 수 있다.) - .headSet(value) : value 이전의 모든 값을 반환
- .tailSet(value) : value 이후의 모든 값을 반환
*2023.09.01
Set 구조 예제
package prt.set;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class SetRunner {
public static void main(String[] args) {
// Set 구조 (Linked, hash, tree)
List<Character> characters = new ArrayList<Character>();
characters.add('A');
characters.add('Z');
characters.add('A');
characters.add('B');
characters.add('Z');
characters.add('F');
characters.add('G');
characters.add('J');
characters.add('E');
//treeSet - 알파벳 순서대로 정렬됨.
Set<Character> treeSet = new TreeSet<Character>(characters);
System.out.println("treeSet : " + treeSet);
//LinkedHashSet - 입력한 순서대로 정렬됨.
Set<Character> LinkedHashSet = new LinkedHashSet<Character>(characters);
System.out.println("LinkedHashSet : "+LinkedHashSet);
//HashSet - 정렬이나 순서 상관없이 삽입됨.
Set<Character> HashSet = new HashSet<Character>(characters);
System.out.println("HashSet : "+HashSet);
}
}
>출력 결과
맵(MAP)
Map < k, v >
-키(key), 값(value)에 대한 2개의 타입으로 제네릭이 정의되는 Map<K, V> 인터페이스
-키와 값이 쌍으로 매핑되는 구조
(Hash)Map
-해시테이블을 사용한 키(key)-값(value) 구조
-해싱을 연산하여 바로 접근하여 데이터 접근 속도가 빠름 (시간복잡도: 1)
-데이터의 추가, 제거도 빠름 (시간복잡도 : 1)
-HashMap은 순서와 키(key)의 중복이 없음. (값(value)는 중복될 수 있음.)
-but, LinkedHashMap 이나 TreeMap을 사용하면 입력순서를 유지 또는 순서를 정렬할 수 있음.
-LinkedHashMap : 입력 순서를 유지 시킴.
-TreeMap : 데이터를 정렬 시킴.
*Map 접근과 수정
// Map 접근, 수정
.get(key) 메소드를 통해 키값으로 value값 접근
.put(key) 메소드에 기존에 있던 키값에 다른 value를 넣어 수정
*Map 반복 접근
-맵은 기본적으로 순서를 가진 직렬구조(Iterable)가 아니기 때문에 일반적으로 for-each 사용불가
-하지만, keySet()메소드를 통해 키값을 Set구조로 가져와 구현가능
<Map의 주요 메서드>
// Map 생성
Map<String, Integer> map = new HashMap<>();
// put(key, value): 새로운 키-값 쌍 추가 또는 기존 키의 값 대체
map.put("apple", 3);
map.put("banana", 2);
map.put("cherry", 5);
// get(key): 지정된 키에 해당하는 값을 반환
int count = map.get("apple");
// containsKey(key): 특정 키가 존재하는지 확인
boolean containsKey = map.containsKey("banana");
// keySet(): 모든 키를 Set으로 반환
Set<String> keys = map.keySet();
// values(): 모든 값들을 Collection으로 반환
Collection<Integer> values = map.values();
// entrySet(): 모든 키-값 쌍을 Set<Map.Entry>으로 반환
Set<Map.Entry<String, Integer>> entries = map.entrySet();
// size(): 키-값 쌍의 개수 반환
int size = map.size();
// isEmpty(): 맵이 비어있는지 여부 확인
boolean isEmpty = map.isEmpty();
// remove(key): 지정된 키에 해당하는 키-값 쌍 제거
map.remove("cherry");
// clear(): 맵의 모든 키-값 쌍 제거
map.clear();
// putAll(map): 다른 맵의 모든 키-값 쌍 추가
Map<String, Integer> otherMap = new HashMap<>();
otherMap.put("grape", 4);
otherMap.put("kiwi", 1);
map.putAll(otherMap);
// forEach(action): 맵의 모든 키-값 쌍에 대해 지정된 작업 수행
map.forEach((key, value) -> System.out.println(key + " -> " + value));
// replace(key, newValue): 특정 키의 값을 새 값으로 대체
map.replace("grape", 6);
// getOrDefault(key, defaultValue): 키의 값을 반환하되, 키가 없으면 기본값 반환
int defaultValue = map.getOrDefault("pear", 0);
// compute(key, remappingFunction): 키의 값을 리매핑 함수로 변경
map.compute("kiwi", (key, value) -> value + 1);
'새싹과정 정리' 카테고리의 다른 글
자바 기초 - 새싹과정 5주차 (2) (0) | 2023.08.17 |
---|---|
자바 기초 - 새싹과정 5주차 (1) (0) | 2023.08.16 |
새싹과정 3주차 (4) -컬렉션, 리스트, 스택, 큐 (0) | 2023.08.04 |
자바 기초 - 새싹과정 3주차 (3) (0) | 2023.08.02 |
자바 기초 - 새싹과정 3주차 (2) (0) | 2023.08.01 |