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 |