728x90
반응형
HashSet
Set인터페이스를 상속받아 메서드를 구현한 대표적인 Collection 클래스
Set인터페이스는 중복을 허용하지 않고 순서를 고려하지 않는다.
- HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인하여 중복이면 제거, 중복이 아니면 추가한다.
- 따라서 객체의 값이 같은지 확인하기 위해 equals와 hashcode를 오버라이딩 해주어야 값을 비교하여 조건부로 값을 저장한다
- 만약 데이터 정렬의 순서를 고려하고싶다면 LinkedHashSet클래스를 사용
메서드 이름 | 기능 |
HashSet(int initialCapacity) | 초기용량 설정 |
add() | 객체 데이터 추가 |
addAll(Collection c) | Collection 데이터 추가 |
remove() | 객체 데이터 제거 |
removeAll(Collection c) | Collection 데이터 제거 |
retainAll(Collection c) | 조건부 삭제 |
clear() | 전부 삭제 |
boolean contains() | 객체데이터가 포함되있는지 여부 |
boolean containsAll(Collection c) | Collection 데이터 전부가 포함되 있는지 여부 |
iterator iterator() | 기준 출력 클래스 |
int[] arr = {3,3,3,5,1,1,1};
Set set = new HashSet();
// HashSet클래스를 Set으로형변환하여 Set의 메서드만 사용
for(int i = 0; i<arr.length; i++) {
set.add(arr[i]);
// set의 기능을 사용하려면 일일이 하나씩 add를 해주어야함
}
System.out.println(set);
// [1, 3, 5]
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
Set set3 = new HashSet();
for(int i = 0; set3.size()<6; i++) {
int num = (int)((Math.random()*45)+1);
set3.add(num);
}
System.out.println(set3);
// 정렬 전의 set3
// [1, 17, 39, 7, 10, 44]
List list = new LinkedList(set3);
// set은 순서를 유지할 수 없기때문에 list에 Linkedlist로 set의 값을 저장하여
Collections.sort(list);
// list를 Collections.sort로 값을 정렬하여 출력
System.out.println(list);
// [1, 7, 10, 17, 39, 44]
HashSet의 예시
쓴 예시 메서드
retainAll : 교집합
addAll : 합집합
removeAll : 차집합
int[] arr = {3,3,3,5,1,1,1};
Set set = new HashSet();
// HashSet클래스를 Set으로형변환하여 Set의 메서드만 사용
for(int i = 0; i<arr.length; i++) {
set.add(arr[i]);
// set의 기능을 사용하려면 일일이 하나씩 add를 해주어야함
}
System.out.println(set);
// [1, 3, 5]
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
Set set2 = new HashSet();
int[] RanArr = new int[6];
for(int i = 0; i<RanArr.length; i++) {
while(set2.size()!=5) {
RanArr[i] = (int)((Math.random()*5)+1);
set2.add(RanArr[i]);
// 1~5까지의 난수를 set배열에 저장하는데
// set의 배열의 크기가 5가 아니라면 반복을하므로
// 무조건 겹치지 않는 12345가 나올 수 밖에 없는 코드
}
}
System.out.println(set2);
Set set3 = new HashSet();
for(int i = 0; set3.size()<6; i++) {
int num = (int)((Math.random()*45)+1);
set3.add(num);
}
System.out.println(set3);
// 정렬 전의 set3
// [1, 17, 39, 7, 10, 44]
List list = new LinkedList(set3);
// set은 순서를 유지할 수 없기때문에 list에 Linkedlist로 set의 값을 저장하여
Collections.sort(list);
// list를 Collections.sort로 값을 정렬하여 출력
System.out.println(list);
// [1, 7, 10, 17, 39, 44]
// =========== HashSet 교집합, 차집합, 합집합 ===========
Set SetOne = new HashSet();
Set SetTwo = new HashSet();
SetOne.add(1);
SetOne.add(2);
SetOne.add(3);
SetTwo.add(2);
SetTwo.add(3);
SetTwo.add(4);
// 교집합 - contains || retainAll
Set setgyo = new HashSet();
Iterator IT = SetOne.iterator();
while(IT.hasNext()) {
Object tmp = IT.next();
// 일단 객체의 정보를 잠시 저장해둘 객체클래스 tmp를 만들고
if(SetTwo.contains(tmp)){
// 비교할 대상이 tmp를 가지고 있다면 새로운 set의 클래스에 추가
setgyo.add(tmp);
}
}
System.out.println(setgyo);
// 쉬운방법
// SetOne.retainAll(SetTwo);
// System.out.println("Retain 사용" + SetOne);
// 공통된 요소만 남기고 전부 지움(삭제되어 객체데이터가 없어짐)
// Retain 사용[2, 3]
// 차집합 - !contains, 포함하지 않으면 출력 || removeAll
Set setCha = new HashSet();
Iterator IT2 = SetOne.iterator();
Object tmp = IT2.next();
if(!(SetTwo.contains(tmp))) {
setCha.add(tmp);
}
System.out.println(setCha);
// 쉬운방법
// SetOne.removeAll(SetTwo);
// System.out.println("removeAll 사용 " + SetOne);
// SetOne, SetTwo의 요소 중 겹치지 않는 데이터 출력
// removeAll 사용 [1]
// 합집합 - 두개 집합 합치기 || addAll
Set allSet = new HashSet();
Iterator IT3 = SetOne.iterator();
Iterator IT4 = SetTwo.iterator();
while(IT3.hasNext()) {
allSet.add(IT3.next());
}
while(IT4.hasNext()) {
allSet.add(IT4.next());
}
System.out.println(allSet);
// 쉬운방법
// SetOne.addAll(SetTwo);
// System.out.println("addAll 사용" + SetOne);
// 중복된 요소를 제외하고 SetTwo의 모든 요소를 추가
// addAll 사용 [1, 2, 3, 4]
// =========== HashSet Equals & hash() 오버라이딩 ===========
Set set4 = new HashSet();
set4.add(new FriedChicken("BBQ", 21000));
set4.add(new FriedChicken("BBQ", 21000));
set4.add(new FriedChicken("60계", 19000));
System.out.println(set4);
set4.hashCode();
}
}
class FriedChicken{
String menu;
int price;
public FriedChicken(String menu, int price) {
this.menu = menu;
this.price = price;
}
@Override
public String toString() {
return "메뉴이름: " + menu + ", 가격: " + price + "\n";
}
// ==================== hashCode & Equals 오버라이딩 ====================
public boolean equals(Object obj) {
if(obj instanceof FriedChicken) {
FriedChicken fc = (FriedChicken) obj;
return fc.menu == this.menu && fc.price == this.price;
}
return false;
}
public int hashCode() {
return Objects.hash(menu, price);
// 객체를 구별하는 기준이 멤버변수이기 때문에 두 변수를 집어넣어서 값이 같은지 비교
}
}
728x90
반응형
'Java > 자바의정석 기초편' 카테고리의 다른 글
자바의 정석 11장 (30일차) - HashMap (0) | 2022.02.21 |
---|---|
자바의 정석 11장 (29일차) - TreSet (0) | 2022.02.20 |
자바의 정석 11장 (29일차) - Arrays 메서드 (0) | 2022.02.20 |
자바의 정석 11장 (29일차) - Iterator (0) | 2022.02.20 |
자바의 정석 11장 (28일차) - Stack&Queue (0) | 2022.02.19 |