Java

Java 문법) 컬렉션 프레임워크 - Set 컬렉션

sejin2 2023. 11. 3. 16:45

Set 컬렉션

: 수학의 집합 개념

순서를 유지하지 않고 저장, 중복 저장 불가, 하나의 null만 저장 가능

 

(1) HashSet

: hashCode( ) 메서드의 리턴값이 같고, equals( ) 메서드가 true를 리턴하면 동일한 객체라고 판단하고 중복 저장하지 않음

데이터 중복을 방지하고 고유한 요소를 관리하기 위한 용도로 사용

예제 1 )

public class Set01 {
	public static void main(String[] args) {
			
		// 상속관계
		// Object --> Set --> HashSet
		
		Object[] objArr = {"1","2","2","3","3","3","4","4","4","4"};
		Set set1 = new HashSet();
		
		for(Object obj : objArr) {
			set1.add(obj);
		}
		System.out.println("set의 길이 : " + set1.size());
		System.out.println(set1);
	}
}

예제 2 )

class Member {
	String name;
	int age;
	
	public Member() { }
	public Member(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	} 
	public void setName(String name) {
		this.name = name;
	} 
	public int getAge() {
		return age;
	} 
	public void setAge(int age) {
		this.age = age;
	} 
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return"Member [name=" + name + ", age= " + age + "]";
	} 
	@Override
	public int hashCode() {
		return name.hashCode() + age;
		//return Objects.hash(age,name);
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Member) {
			Member member = (Member)obj;
			return (member.age == age) && (member.name.equals(name));
		}
		return false;
	}
} 
public class Set02 {

	public static void main(String[] args) { 
		Set<Member> set = new HashSet<Member>();
		
		set.add(new Member("최재호", 30));
		set.add(new Member("최재호", 30));
		
		System.out.println(set.size());
	} 
}

HashSet 을 이용해 로또 번호 추출하기 ! 

public class Set03 {

	public static void main(String[] args) {
		Set<Integer> set = new HashSet<>();
		
			while(set.size() < 6) {
				set.add((int)(Math.random()*45) + 1);
		 }  
		// 순서대로 출력
		// index가 없기때문에 할 수 없음 => List로 변경 후 사용
		List list = new LinkedList(set);
		Collections.sort(list);
		System.out.println(list);
	} 
}

(2) TreeSet

: 이진트리를 기반으로 한 Set컬렉션으로 검색 관련 메서드가 정의되어 있음

리턴타입 메서드 설명
E first( ) 제일 낮은 객체를 리턴
E last ( ) 제일 높은 객체를 리턴
E lower(E e) 주어진 객체보다 바로 아래 객체를 리턴
E higher(E e) 주어진 객체보다 바로 위 객체를 리턴
E floor(E e) 주어진 객체와 동등한 객체가 있으면 리턴, 없으면 주어진 객체의 바로 아래 객체를 리턴
E ceiling(E e) 주어진 객체와 동등한 객체가 있으면 리턴, 없으면 주어진 객체의 바로 위의 객체를 리턴
E pollFirst( ) 제일 낮은 객체를 꺼내오고 컬렉션에서 제거
E pollLast( ) 제일 높은 객체를 꺼내오고 컬렉션에서 제거
NavigableSet<E> headSet(E toElement,
boolean inclusive)
주어진 객체보다 낮은 객체들을 NavigableSet으로 리턴, 주어진 객체 포함 여부는 두 번째 매개 값에 따라 달라짐
NavigableSet<E> tailSet(E toElement,
boolean inclusive)
주어진 객체보다 높은 객체들을 NavigableSet으로 리턴, 주어진 객체 포함 여부는 두 번째 매개 값에 따라 달라짐
NavigableSet<E> subSet(E toElement,
boolean inclusive,
E toElement,
boolean inclusive)
시작과 끝으로 주어진 객체 사이의 객체들을 NavigableSet으로 리턴, 시작과 끝 객체의 포함 여부는 두 번째, 네 번째 매개 값에 따라 달라짐

예제 1 ) 

public class TreeSet06 {

	public static void main(String[] args) {
		TreeSet<Integer> scores = new TreeSet<>();
		scores.add(87);
		scores.add(100);
		scores.add(93);
		scores.add(47);
		scores.add(63);
		scores.add(59);
		
		System.out.println(scores.first());
		System.out.println("가장 낮은 점수 : " + scores.first());
		System.out.println("가장 높은 점수 : " + scores.last());
		
		System.out.println("100점 아래 점수 : " + scores.lower(100));
		System.out.println("70점 위 점수 : " + scores.higher(70));
		
		System.out.println("74점과 동일한 점수 아니면 바로 아래 점수 : " + scores.floor(74));
		System.out.println("74점과 동일한 점수 아니면 바로 위의 점수 : " + scores.ceiling(74));
		
		// 매개변수 ( 점수, 본인 포함여부( 기본값 : false ))
		System.out.println("87점보다 낮은 점수들 : " + scores.headSet(87, true));
		// tailSet( 점수, 본인 포함여부( 기본값 : true ))
		System.out.println("87점보다 높은 점수들 : " + scores.tailSet(87));
		// subSet( 시작점수, 시작점수 포함여부( 기본값 : true ), 끝 점수 , 끝 점수 포함여부 ( 기본값 : false ))
		System.out.println("74점 ~ 100점 사이의 점수들 : " + scores.subSet(74, 100));
		

		System.out.println("가장 낮은 점수 삭제 : " + scores.pollFirst());
		System.out.println(scores);
		System.out.println("가장 높은 점수 삭제 : " + scores.pollLast());
		System.out.println(scores);
	} 
	
}

예제 1 - 출력결과 )

예제 2 )

public class TreeSet07 {

	public static void main(String[] args) {
		int[] arrInt = {1, 4, 3 ,6 ,7 ,1, 6, 4, 6, 8};	// 10개 중 중복 : 4개
		
		TreeSet<Integer> ts = new TreeSet<>();
		for (Integer o : arrInt) {
			ts.add(o);
		}
		System.out.println(Arrays.toString(arrInt));
		System.out.println(ts);	// 오름차순 정렬로 출력
		
		// 내림차순 정렬 : descendingSet()
		NavigableSet<Integer> descend = ts.descendingSet();
		System.out.println(descend);
	}

}

예제 2 - 출력결과 )