Collection - HashSet

성혜·2024년 1월 23일
0

Java

목록 보기
17/25
post-thumbnail

HashSet

Set은 순서가 없는 집합이며 식별자(index or key)가 없다.
=> 방을 구분할 수 없다.

데이터 중복을 허용하지 않는다.


  • HashSet 사용법 예시 코드 (추가, 개수 확인, 읽기)
		HashSet<String> set = new HashSet<>();
		
		//1. 요소 추가
		set.add("사과");
		System.out.println(set.add("딸기"));
		set.add("바나나");
		System.out.println(set.add("딸기")); //중복을 허용하지 않아 무시됨 = boolean 
		
		//2. 요소 개수
		System.out.println(set.size());
		System.out.println(set);
		System.out.println();
		
		//3. 요소 읽기 > 방을 구분 불가능 > 원하는 요소 추출 불가능;
		//- 읽기 도구 제공(중요*******) > iter == 향상된 for문
		
		Iterator<String> iter = set.iterator();
		
        //hasNext()는 가상의 커서가 다음 방의 값이 있는지 알려주는 것
        //- 있으면 true, 없으면 false
		System.out.println(iter.hasNext()); //true/false로 보여줌
		System.out.println(iter.next());//요소를 보여줌
		
		System.out.println(iter.hasNext()); //true/false로 보여줌
		System.out.println(iter.next());//요소를 보여줌
		
		System.out.println(iter.hasNext()); //true/false로 보여줌
		System.out.println(iter.next());//요소를 보여줌
		
		System.out.println(iter.hasNext()); //true/false로 보여줌
		System.out.println(iter.next());//요소를 보여줌
		
		while(iter.hasNext()) { //다음번에 데이터가 있는지 확인
			System.out.println(iter.next());
		}
		
		//루프 종료 == iterator 모두 소비 (끝까지 탐색)
		//System.out.println(iter.next()); //에러뜸 (소비가 다 끝나면 더이상 사용 못함)
		
		//더 읽고 싶다면? => 새로 만들어야함
		iter = set.iterator();
		System.out.println(iter.next()); //사과 출력
		
		//몇번이고 재호출이 가능 
		for(String item : set) {
			System.out.println(item);
		}
	}


  • 로또 생성

: set은 중복이 안되기 떄문에 로또 번호 같은 예제를 만들기 좋음!!

1. ArrayList 활용

		Random rnd = new Random();
		
		ArrayList<Integer> lotto = new ArrayList<>();
		
		//for(;lotto.size()<6;) 
		while(lotto.size()<6){ //while 문을 쓰는게 나음
			
			int n = rnd.nextInt(45)+1;
			
			//기존 요소들과 중복 검사
			if(check(lotto,n)) {

			}else {
				//중복x
				lotto.add(n);
				
			}
					
		}
		
		Collections.sort(lotto);
		System.out.println(lotto); 
		System.out.println();
        
        
        private static boolean check(ArrayList<Integer> lotto, int n) {
		
		for(int i=0; i<lotto.size(); i++) {
			if(lotto.get(i)==n) {
				return true;
			}
		}
		
		return false;
	}

2. HashSet 활용


		HashSet<Integer> lotto2 = new HashSet<>();
		
		while(lotto2.size() < 6) { //size = 0~5
			int n = rnd.nextInt(45)+1;
			lotto2.add(n);
		}
		System.out.println(lotto2); //결과: [5, 6, 38, 7, 41, 25]

중복값을 제외하고 싶다면 Set을 쓰는 것이 좋다

하지만
순서가 없기 때문에 정렬을 할 수 없어 아래 코드는 에러가 뜬다.

Collections.sort(lotto2); 

그럼에도 정렬을 하고 싶다면 list로 전환 !
(다음에 포스팅 할 TreeSet은 정렬이 자동으로 됨! 그 포스팅도 확인 해보기)

		ArrayList<Integer> lotto3 = new ArrayList<Integer>(lotto2); //생성자에 set(lotto2)을 넣을 수 있음 ! 
		//array와 set은 형제라 쌍뱡향으로 생성자에 사용가능! set을 만들때 array를 쓰면 중복 제거로 만들어 줌
		
		Collections.sort(lotto3);
		System.out.println(lotto3);
profile
하루를 정리하고 기록합니다.

0개의 댓글