자바의 정석 11장 (29일차) - HashSet

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