다연이네

[days22] 컬렉션 클래스<Set> - HashSet 본문

Java

[days22] 컬렉션 클래스<Set> - HashSet

 다연  2020. 10. 21. 09:31
반응형

HashSet

Collection <- Set계열 순서 없고 중복이 허용되지 않음 
HashSet 컬렉션 클래스가 가장 많이 사용되는 대표적인 클래스로,내부적으로 HashMap을 이용해서 만들어졌다.

HashSet<Integer> hs = new HashSet<Integer>();
		
		
		hs.add(9); 
		hs.add(1);
		hs.add(15); 
		hs.add(1); // 중복을 허용하는지 확인하기 위해
		hs.add(3); 
		hs.add(7); 
	
		System.out.println(hs); 
        //[1, 3, 7, 9, 15] 순서가 없다 => 0번째 가져오겠다 의미 없다
        

[문제] 로또번호 6개 만들어 출력 

HashSet<Integer> lottos = new HashSet<Integer>(6);
Random rnd = new Random();
	while (lottos.size()!=6) {
		int lotto = rnd.nextInt(45)+1;
		lottos.add(lotto);
	}
System.out.println(lottos);

 

[문제] 로또 번호를 받아 정렬된 번호로 출력

=> ArrayList로 만들기 (LinkedArrayList도 상관 없음)

	Set<Integer> set = new HashSet<Integer>(); //업캐스팅이 더 좋은 코딩이다
	for (int i = 0;set.size() <6; i++) {
		set.add((int)(Math.random()*45)+1);
	}
	System.out.println(set); //[32, 20, 6, 22, 25, 10]
    
    	ArrayList<Integer> list = new  ArrayList<Integer>(set);
		Collections.sort(list);
		System.out.println(list); //[6, 10, 20, 22, 25, 32]

=> 만약,  중복 체크를 해서 안되도록 만들고 + 순서 유지하는 컬렉션 클래스가 있다면

     set으로 받아 list로 만들 필요 없겠다 == LinkedHasgSet<E>

     (*오름차순 정렬이 아닌 데이터 입력 순서대로 순서 유지)

	LinkedHashSet<Integer> lhs = new LinkedHashSet<Integer>();
		for (int i= 0; lhs.size() < 6; i++) {
			lhs.add((int)(Math.random()*45)+1);
			
		}
	//	Collections.sort(lhs); //얘는 list계열만 된다
	System.out.println(lhs);

 

HashSet 특정 조건(학번)에 대한 중복 데이터 삽입 설정 - 오버라이딩

package review;

import java.util.HashSet;

public class Re03 {
	public static void main(String[] args) {
		//HashSet
		HashSet<Member> hs = new HashSet<Member>();

		//hs.add(1, "배다연",23);
		
		hs.add(new Member(1, "배다연", 23));
		hs.add(new Member(2, "김동준", 24));
		hs.add(new Member(3, "캬라멜", 1));
		hs.add(new Member(3, "캬라멜", 1));
		System.out.println(hs.size());
		//학번이 동일한 데이터가 new연산자로 인해 다른 객체로 인식되어 
		//중복 삽입 되었을 때 삽입하지 못하게 하는 방법
		// 1=> 객체의 hashCode() 메소드를 사용해서 해시코드 얻어와서 같은지 체크 => hashcode 오버라이딩
		// 2=> equals()함수를 사용해서 비교 => equals 오버라이딩 
		
		
		System.out.println(hs); //순서 없음
		
	}
}
class Member {
	int sno;
	String name;
	int age;
	public Member(int sno, String name, int age) {
		super();
		this.sno = sno;
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return String.format(">sno:%d, name:%s, age:%d"
				, this.sno, this.name, this.age);
	}
	@Override
	public boolean equals(Object obj) {
		Member m;
		if(obj instanceof Member && obj!=null) {
			m = (Member) obj;
			return m.sno == this.sno;
		}
		return false;
	}
	@Override
	public int hashCode() {
		
		return sno;
	}
	
	
	
}

 

두개의 HashSet 교집합, 합집합, 차집합 구하기

package review;

import java.util.HashSet;
import java.util.Iterator;

public class Re04 {

	public static void main(String[] args) {
		HashSet<Integer> h1 = new HashSet<Integer>();
		h1.add(1); h1.add(2); h1.add(3); h1.add(4); h1.add(5);
		
		HashSet<Integer> h2 = new HashSet<Integer>();
		h2.add(4); h2.add(5); h2.add(6); h2.add(7); h2.add(8);
	
		System.out.println(h1);
		System.out.println(h2);
		
		HashSet<Integer> kyo = new HashSet<Integer>();
		HashSet<Integer> cha = new HashSet<Integer>();
		HashSet<Integer> hap = new HashSet<Integer>();
		
		Iterator<Integer> ir1 = h1.iterator();
		while (ir1.hasNext()) {
			Integer num = ir1.next();
			if(h2.contains(num)) kyo.add(num);	//교집합
			else cha.add(num);			//차집합
		}
		System.out.println(kyo);
		System.out.println(cha);
		
		hap.addAll(h1);
		hap.addAll(h2);
		System.out.println(hap);//합집합
		


	}

}
반응형
Comments