Set
인터페이스를 구현한 컬렉션 클래스로 중복을 허용하지 않으며 순서를 유지하지 않는다. 순서를 유지하려면 LinkedHashSet
클래스를 사용하면 된다.
HashSet() // 기본 생성자
HashSet(Collection c) // 컬렉션을 HashSet으로 변환
HashSet(int initialCapacity) // 용량을 지정하여 생성
HashSet(int intitialCapacity, float loadFactor) // 용량을 늘릴 시점을 정한다
Object[] objArr = {"1",new Integer(1),"2","2","3","3","4","4","4"};
Set set = new HashSet();
for(int i=0; i < objArr.length; i++) {
set.add(objArr[i]); // HashSet에 objArr의 요소들을 저장
}
System.out.println(set); // [1, 1, 2, 3, 4] -> 1 하나는 문자열
Set set = new HashSet();
// HashSet은 중복을 허용하지 않으므로 중복을 제거하는 코드를 작성할 필요가 없음
for (int i = 0; set.size() < 6 ; i++) {
int num = (int)(Math.random()*45) + 1;
set.add(new Integer(num)); // Hashset에 추가
}
// Set은 순서를 유지하지 않으므로 정렬을 하려면 List로 변환해야 함
List list = new LinkedList(set); // LinkedList로 변환
Collections.sort(list); // 정렬
System.out.println(list);
HashSet set = new HashSet();
set.add("abc");
set.add("abc"); // 중복이므로 저장하지 않음
set.add(new Person("David", 10));
set.add(new Person("David", 10)); // 새로운 객체 = 객체 주소가 다르므로 저장 가능
set.add(new Person2("Jason", 20));
set.add(new Person2("Jason", 20));
System.out.println(set);
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
}
// HashSet을 제대로 사용하려면 equals()와 hashCode()를 오버라이딩 해야 함
class Person2 {
@Override
public int hashCode() {
return Objects.hash(age, name); // 가변인자
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person2))
return false;
Person2 p = (Person2) obj; // 입력받은 Object 타입을 형변환
return this.name.equals(p.name) && this.age == p.age;
}
String name;
int age;
Person2(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + ":" + age;
}
}
// 결과
[abc, David:10, Jason:20, David:10] // 순서를 유지하지 않음
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)) // A에 B의 요소가 있는 지 확인
setKyo.add(tmp); // 일치하는 요소가 있으면 저장
}
// setA.retainAll(setB); // 공통된 요소만 남기고 삭제
it = setA.iterator();
// 차집합 구하기
while (it.hasNext()) {
Object tmp = it.next();
if (!setB.contains(tmp)) // A의 요소 중 B의 요소와 일치하지 않는 것만 저장
setCha.add(tmp);
}
// setA.removeAll(setB); // setA에서 setB의 요소를 제거
// 합집합 구하기
it = setA.iterator();
while (it.hasNext()) // 있는 요소는 다 저장
setHab.add(it.next());
it = setB.iterator();
while (it.hasNext())
setHab.add(it.next());
// setA.addAll(setB); // setB의 모든 요소를 저장 (중복은 제외)
System.out.println("A ∩ B = " + setKyo);
System.out.println("A ∪ B = " + setHab);
System.out.println("A - B = " + setCha);
// 결과
A = [1, 2, 3, 4, 5]
B = [4, 5, 6, 7, 8]
A ∩ B = [4, 5]
A ∪ B = [1, 2, 3, 4, 5, 6, 7, 8] // 중복없이 저장됨
A - B = [1, 2, 3]