자바의 정석 - HashSet

송용준·2023년 5월 2일
0

HashSet - 순서x, 중복x

  • Set인터페이스를 구현한 대표적인 컬렉션 클래스
  • 순서를 유지하고 싶으면 LinkedHashSet 클래스를 사용하면 된다. (연결하면 linked 순서가 생긴다.)

TreeSet

  • 범위 검색과 정렬에 유리한 컬렉션 클래스

HashSet - 주요 메서드

import java.util.*;

public class Java {
	public static void main(String[] args) {
		Object[] objArr = {"1", new Integer(1), "2", "3", "4", "4", "4"};
		Set set = new HashSet();
		for(int i = 0; i < objArr.length; i++) {
			set.add(objArr[i]);		// HashSet에 objArr요소들을 저장한다. 중복 제외, 1은 숫자와 String이 각자 존재
		}
		// HashSet에 저장된 요소들을 출력한다.
		System.out.println(set);
		
		// HashSet에 저장된 요소들을 출력한다. (Iterator 이용)
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

랜덤 5자리수

import java.util.*;

public class Java {
	public static void main(String[] args) {
		
		Set set = new HashSet();	// set의 크기가 6보다 작은 동안 1~45사이의 난수를 저장	
		
		for(int i = 0; set.size() < 6; i++) {
			int num = (int)(Math.random()*45)+1;
			set.add(num);
		}
		// System.out.println(set);	// 랜덤수 랜덤 배치
		
		List list = new LinkedList(set);	// 랜덤수 작은수부터 차례로 배치
		Collections.sort(list);		// 정렬하기
		System.out.println(list);
	}
}

HashSet 중복 확인

  • HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인
  • boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출. equals()와 hashCode()가 오버라이딩 되어 있어야 함
import java.util.*;

public class Java {
	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);
	}
}

// equals()와 hashCode()를 오버라이딩 해야 HashSet이 바르게 동작
class Person {
	String name;
	int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int hashCode() {
		// int hash(Object... values);  가변인자
		return Objects.hash(age, name);
	}

	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof Person)) return false;
		Person p = (Person) obj;
		return age == p.age && Objects.equals(name, p.name);	// 나자신(this)의 이름과 나이를 p와 비교
	}

	public String toString() {
		return name + ":" + age;
	}
}

contains() 함수를 통해 교집합
또는 retainAll() --> 코드 간단해짐
add() 함수를 통해 합집합
또는 addAll() --> 코드 간단해짐
removeAll() 함수를 통해 차집합

profile
용용

0개의 댓글