본문 바로가기

JAVA

HashSet

HashSet

Set 인터페이스를 구현한 가장 대표적인 컬렉션

중복 X 순서 X -> 이러한 특징으로 컬렉션 내의 중복 요소들을 제거할 때 주로 사용

cf) 중복을 제거하는 동시에 저장한 순서를 유지하고 싶으면 LinkedHashSet 사용

 

 

boolean add()

새로운 객체를 저장 -> 성공하면 true, 실패하면 false

 

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Ex11_9 {

	public static void main(String[] args) {
		
		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); // HashSet에 저장된 요소들을 출력
		
		Iterator it = set.iterator(); // HashSet에 저장된 요소들을 출력
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}

}

/*
[1, 1, 2, 3, 4]
1
1
2
3
4
*/

 

set은 Collections의 sort() 메서드 사용 불가능 -> set을 list로 변환하고 list를 sort()하자.

 

Math.random() * 45 -> 0~44까지 랜덤

Math.random() * 45 + 1 -> 1~45까지 랜덤

(int) (Math.random() * 45) + 1 -> Math.random()은 원래 double이기 때문에 int로 형변환 필요

 

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class Ex11_10 {

	public static void main(String[] args) {
		
		// 1~45까지 6개의 난수를 뽑는 프로그램
	
		Set set = new HashSet();
		
		for(int i = 0; set.size() < 6; i++) {
			int num = (int)(Math.random() * 45) + 1;
			set.add(num);
		}
		
		List list = new LinkedList(set); // 1.정렬을 위해 set을 list에 넣음
		Collections.sort(list); 		 // 2.sort()메서드는 list에서만 사용 가능
		System.out.println(list);		 // 3.list 출력
	
	}

}

/*
[1, 3, 6, 19, 40, 41] // 계속하여 랜덤값 출력
*/

 

package java11;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Set;

public class Ex11_11 {

	public static void main(String[] args) {
		
		HashSet 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 {
	
	String name;
	int age;
	
	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
    
	// 중복을 제거하기 위해 equals() hashCode() 메서드 오버라이딩
	@Override
	public int hashCode() {
		return Objects.hash(name, age);
	}

	@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 String toString() { return name + ":" + age; }
    
}

/*
[David:10, abc]
*/

 

HashSet을 이용하여 교집합, 차집합, 합집합을 구하는 예제

 

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Set;

public class Ex11_12 {

	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)) { // B(tmp)에 있는 원소가 A에 있니?
				setKyo.add(tmp); // 겹치는 원소만 Kyo에 넣어줘
			}
		}
		System.out.println("교집합: " + setKyo);
		
		// 차집합 구하기
		it = setA.iterator();
		while(it.hasNext()) {
			Object tmp = it.next();
			if(!(setB.contains(tmp))) { // !(A(tmp)에 있는 원소가 B에 있니?)
				setCha.add(tmp); // B에 없는 것만 setCha에 저장
			}
		}
		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);
	}

}

/*
A = [1, 2, 3, 4, 5]
B = [4, 5, 6, 7, 8]
교집합: [4, 5]
차집합: [1, 2, 3]
합집합: [1, 2, 3, 4, 5, 6, 7, 8]
*/

 

'JAVA' 카테고리의 다른 글

HashMap  (0) 2021.01.08
TreeSet  (0) 2021.01.07
Arrays 클래스  (0) 2020.12.23
BufferedReader / BufferedWriter / StringTokenizer  (0) 2020.12.22
JDK / JRE / JVM  (0) 2020.12.17