Java 컬렉션 : HashSet

I C-AN·2021년 8월 15일
0

Java

목록 보기
24/26
post-thumbnail

Set : HashSet

Set 인터페이스를 구현한 컬렉션 클래스로 중복을 허용하지 않으며 순서를 유지하지 않는다. 순서를 유지하려면 LinkedHashSet 클래스를 사용하면 된다.

HashSet 생성자

HashSet() // 기본 생성자
HashSet(Collection c) // 컬렉션을 HashSet으로 변환
HashSet(int initialCapacity) // 용량을 지정하여 생성
HashSet(int intitialCapacity, float loadFactor) // 용량을 늘릴 시점을 정한다

예제 1

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 하나는 문자열

예제 2 - 로또번호 생성기

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);

예제 3 - 객체 비교하기

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] // 순서를 유지하지 않음

예제 4 - 집합

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]
AB = [4, 5]
AB = [1, 2, 3, 4, 5, 6, 7, 8] // 중복없이 저장됨
A - B = [1, 2, 3]
profile
할 수 있다

0개의 댓글