목차
- set의 구현클래스
- HashSet과 TreeSet
- HashSet의 주요 메서드
- HashSet 예제
Set - 순서X, 중복X
대표적인 구현 클래스: HashSet, TreeSet
HashSet
Set 인터페이스를 구현한 대표적인 컬렉션 클래스
순서를 유지하려면, LinkedHashSet
TreeSet
범위 검색과 정렬에 유리한 컬렉션 클래스
HashSet 보다 데이터 추가, 삭제에 시간이 더 걸림(데이터가 많을수록)
HashSet 주요 메서드
HashSet( ): 생성자
HashSet(Collection c): 컬렉션의 모든 객체 저장
HashSet(int initialCapacity): 초기용량
HashSet(int initialCapacity, float loadFactor): 초기용량, 언제 늘릴것 인가?(0.8 => 80% => x2)
retainAll(Collection c): 컬렉션에 들어있는 것 뺴고 삭제(차집합)
예제
public class HashSetEx1 {
public static void main(String[] args) {
Object[] objArr = {"1", Integer.valueOf(1), "2", "2", "3", "3", "4", "4"};
Set set = new HashSet();
for (int i = 0; i < objArr.length; i++) {
set.add(objArr[i]); // HashSet에 objArr의 요소들을 저장한다.
}
// HashSet에 저장된 요소들을 출력한다.
System.out.println(set);
// HashSet에 저장된 요소들을 출력한다(Iterator이용)
Iterator it = set.iterator();
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
[1, 1, 2, 3, 4]
1
1
2
3
4
순서를 유지하지 않고, 중복된 요소가 추가되는 것을 허용하지 않는다.
public class HashSetEx2 {
public static void main(String[] args) {
Set set = new HashSet();
for (int i = 0; set.size() < 6; i++) {
int num = (int)((Math.random() * 45) + 1); // 1~45
set.add(new Integer(num)); // 정렬되지 않은 상태
}
List list = new LinkedList(set); // LinkedList(Collection c), set의 요소들을 List에 저장
Collections.sort(list); // Collections.sort(), list를 정렬
System.out.println(list); // list를 출력
}
}
[2, 9, 27, 29, 34, 40]
HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인
같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
boolean add(Object o)는 저장할 객체의 equals( )와 hashCode( ) 호출(중복인지 아닌지 확인)
HashSet에 저장하려면 equals( )와 hashCode( )가 오버라이딩 되어 있어야함(Object를 상속받아야 함)
public class HashSetEx3 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David", 10));
set.add(new Person("David", 10));
System.out.println(set);
}
}
class Person extends Object {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + " : " + age;
}
}
[abc, David : 10, David : 10]
↓
public class HashSetEx3 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("abc");
set.add("abc");
set.add(new Person("David", 10));
set.add(new Person("David", 10));
System.out.println(set);
}
}
class Person extends Object {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + " : " + age;
}
@Override
public int hashCode() {
// return (name + age).hashCode();
// int has(Object... values); // iv(객체를 구분하는 기준) 가변인자
return (name + age).hashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person)) return false;
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
public class HashSetEx4 {
public static void main(String[] args) {
HashSet setA = new HashSet();
HashSet setB = new HashSet();
HashSet setHab = new HashSet();
HashSet setKyo = new HashSet();
HashSet setCha = new HashSet();
setA.add("1");
setA.add("2");
setA.add("3");
setA.add("4");
setA.add("5");
System.out.println("A = " + setA);
setB.add("4");
setB.add("5");
setB.add("6");
setB.add("7");
setB.add("8");
System.out.println("B = " + setB);
// 교집합
Iterator it = setB.iterator();
while (it.hasNext()) {
Object tmp = it.next();
if (setA.contains(tmp)){
setKyo.add(tmp);
}
}
System.out.println("교집:" + setKyo);
// 차집합
it = setA.iterator();
while (it.hasNext()) {
Object tmp = it.next();
if (!setB.contains(tmp)){ // SetB에 없는 것만 차집합에 저장
setCha.add(tmp);
}
}
System.out.println("차집:" + setCha);
// 합집합
it = setA.iterator();
while (it.hasNext()) {
setHab.add(it.next());
}
it = setB.iterator();
while (it.hasNext()) {
setHab.add(it.next());
}
System.out.println("합집:" + setHab);
}
}
setA.retainAll(setB); // 교집합 공통된 요소만 남기고 삭제
setA.addAll(setB); // 합집합. setB의 모든 요소를 추가(중복제외)
setA.removeAll(setB); // 차집합. setB와 공통요소 제거
B = [4, 5, 6, 7, 8]
교집:[4, 5]
차집:[1, 2, 3]
합집:[1, 2, 3, 4, 5, 6, 7, 8]
'Java' 카테고리의 다른 글
[Java] HashMap 키와 값 (0) | 2024.05.08 |
---|---|
[Java] TreeSet 범위 탐색, 정렬 (0) | 2024.05.08 |
[Java] Comparator와 Comparable 객체 정렬 (0) | 2024.05.08 |
[Java] Arrays - 배열을 쉽게 다루고 싶다면 (0) | 2024.05.07 |
[Java] Iterator, Listlterator, Enumeration (0) | 2024.05.07 |