[CS] 맵, 셋
우선 이번 글에서 맵, 셋을 다루기전에 각 인터페이스의 특징을 알아보고자 한다
1. 각 인터페이스의 특징
인터페이스 | 구현 클래스 | 특징 |
List | LinkedList Stack Vector ArrayList |
순서가 있는 데이터의 집합, 데이터의 중복을 허용한다 |
Set | HashSet TreeSet |
순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다. |
Map | HashMap TreeMap HashTable Properties |
키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합이다 순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복을 허용한다 |
2. 맵 (Map)
- 맵은 키(Key)와 값(Value)의 쌍으로 이루어진 데이터의 집합이다
- 순서가 유지되지 않는다
- 키는 중복을 허용하지 않는다
- 값은 중복을 허용 한다
2-1) 맵 (Map) 종류
Hashtable
- HashMap보다는 느리지만 동기화가 지원된다
- 키와 값으로 null이 허용되지 않는다
HashMap
- 중복을 허용하지 않고 순서를 보장하지 않는다
- 키와 값으로 null이 허용된다
- Hashtable보다는 HashMap을 사용하자
TreeMap
- 이진 탐색 트리의 형태를 가진다
- 데이터를 정렬된 순서로 저장한다. 정렬된 상태를 유지하기 위해 시간이 다소 오래 걸린다
LinkedHashMap
- HashMap과 상당히 흡사하다
- 데이터를 넣을 때 입력한 Key의 순서를 지키지 않는 HashMap과 달리 Key의 순서를 보장한다
2-2) 맵 (Map) 메서드
new Map()
- 맵의 생성자 함수로 맵을 만들 때 사용한다
map.set(key, value)
- key로 value를 저장한다
map.get(key)
- key로 해당 value를 가져온다
map.has(key)
- 해당 key가 있는지 검사하고 true, false를 반환한다
map.delete(key)
- key에 해당하는 값을 삭제한다
map.clear()
- 맵 안의 모든 요소를 지운다
map.size()
- 요소의 개수를 반환한다
2-3) Hash Map 예시
// HashMap 선언
HashMap<String,String> map1 = new HashMap<String,String>(); //HashMap생성
HashMap<String,String> map2 = new HashMap<>(); //new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1); //map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10); //초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f); //초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{ //초기값 지정
put("a","b");
}};
// HashMap 값 추가
HashMap<Integer,String> map = new HashMap<>(); //new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");
// HashMap 값 삭제
HashMap<Integer,String> map = new HashMap<Integer,String>(){{ //초기값 지정
put(1,"사과");
put(2,"바나나");
put(3,"포도");
}};
map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거
// HashMap 값 출력
HashMap<Integer,String> map = new HashMap<Integer,String>(){{ //초기값 지정
put(1,"사과");
put(2,"바나나");
put(3,"포도");
}};
System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1)); //key값 1의 value얻기 : 사과
//entrySet() 활용
for (Entry<Integer, String> entry : map.entrySet()) {
System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
//KeySet() 활용
for(Integer i : map.keySet()){ //저장된 key값 확인
System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
3. 셋 (Set)
- 셋은 집합이다
- 집합에서는 중복된 데이터를 허용하지 않는다
- 즉 셋은 중복을 허용하지 않는다
- 순서가 유지하지 않는다
- 검색기능이 없어 하나씩 꺼낼 수 있는 Iterator를 제공한다
- 향상된 for문을 이용해서 더 쉽게 꺼내 올 수도 있다
- contains로 값을 찾을 수 는 있다
3-1) 셋 (Set) 종류
HashSet
- 순서 및 정렬을 하지 않는 가장 단순한 Set이다
- 덕분에 가장 빠른 임의 접근 속도를 가진다
LinkedHashSet
- HashSet과 흡사하다
- 연결 리스트를 사용해서 데이터를 저장하기 때문에 Key의 순서를 보장한다
TreeSet
- 이진 탐색 트리(레드-블랙 트리)의 형태를 가진다
- 데이터를 정렬된 순서로 저장, 정렬된 상태를 유지하기 위해 시간이 다소 오래 걸린다
- 정렬 방법을 지정할 수 있다
3-2) 셋 (Set) 메서드
new Set(iterable)
- 셋을 만든다
- 이 트러블 객체를 전달받으면(대게 배열을 전달 반음) 그 안의 값을 복사해 셋에 넣어 준다
set.add(value)
- 값을 추가하고 셋 자신을 반환한다
set.delete(value)
- 값을 제거한다
- 값을 지우는 데 성공하면 true를 반환합니다 아니먄 false를 반환한다
set.has(value)
- 셋 내의 값이 존재하면 true, false를 반환한다
set.clear()
- 셋을 비운다
set.size()
- 셋에 몇 개의 값이 있는지 세어준다
3-3) Hash Set 예시
// HashSet 선언
HashSet<Integer> set1 = new HashSet<Integer>(); //HashSet생성
HashSet<Integer> set2 = new HashSet<>(); //new에서 타입 파라미터 생략가능
HashSet<Integer> set3 = new HashSet<Integer>(set1); //set1의 모든 값을 가진 HashSet생성
HashSet<Integer> set4 = new HashSet<Integer>(10); //초기 용량(capacity)지정
HashSet<Integer> set5 = new HashSet<Integer>(10, 0.7f); //초기 capacity,load factor지정
HashSet<Integer> set6 = new HashSet<Integer>(Arrays.asList(1,2,3)); //초기값 지정
// HashSet 값 추가
HashSet<Integer> set = new HashSet<Integer>(); //HashSet생성
set.add(1); //값 추가
set.add(2);
set.add(3);
// HashSet 값 삭제
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); //HashSet생성
set.remove(1); //값 1 제거
set.clear(); //모든 값 제거
// HashSet 크기 구하기
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); //HashSet생성
System.out.println(set.size()); //set 크기 : 3
// HashSet 값 출력
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); //HashSet생성
System.out.println(set); //전체출력 [1,2,3]
Iterator iter = set.iterator(); // Iterator 사용
while(iter.hasNext()) { //값이 있으면 true 없으면 false
System.out.println(iter.next());
}
// HashSet 값 검색
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); //HashSet생성
System.out.println(set.contains(1)); //set내부에 값 1이 있는지 check : true