Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[4주차] 69. 컬렉션, Set 인터페이스를 상속받은 HashSet 타입(순서,index X, 중복데이터 X)*** 본문

K-DigitalTraining 강의/1. Java

[4주차] 69. 컬렉션, Set 인터페이스를 상속받은 HashSet 타입(순서,index X, 중복데이터 X)***

이대곤 2022. 6. 2. 14:52

* HashSet 클래스란?

  Set 인터페이스를 구현하여 만들어진 클래스로, 객체만을 저장 가능하며

  Set의 특징을 그대로 상속받아 순서(index)가 없고, 중복 데이터의 입력이 불가능하다. ( ArrayList와 완전 반대)

  중복 데이터의 입력이 불가능해 같은 값을 넣으려고 하면 에러는 안나지만 그 시도가 무시된다.
  혹시라도 알고리즘 문제 해결 과정중에 중복되는 데이터를 제거하고 싶다면 이걸 사용하면 좋을거 같다.
  과거에 예제를 해결하면서 중복없는 로또번호 6개를 만드는게 있었는데 이걸 활용하면 딱이다.

출처: 생활코딩

* HashSet 에서 자주 사용되는 메소드

HashSet<타입> hs = new HashSet<타입>();

hs.add(객체);		// 원소추가

hs.remove(객체);		// 원소제거

hs.clear(객체);		// 원소 전체 제거

hs.contains(객체);	// 특정 원소 존재여부 true/false 반환

hs.isEmpty();		//  원소 존재여부 true/false 반환

//HashSet에는 get() 메서드가 없어서 일반 for 문으로는 요소 출력이 불가능하다.
for(타입 s : hs) {
	System.out.println(s);
}
		
//Enumeration 타입을 이용해 모든 원소를 출력하는 방법
Enumeration<타입> e = Collections.enumeration(hs); // Vector와 달리 ArrayList, HashSet은 elements() 메소드를 가지지 않아 Collections 클래스의 enumeration() 메소드를 이용해야 함, 이 클래스는 list set 공통 상위의 인터페이스인 Collection과 다름  
while (e.hasMoreElements()) {
	System.out.println(e.nextElement());
}        
		
Iterator<타입> it = hs.iterator(); // Iterator는 인터페이스임. 따라서 객체를 만들순 없지만, 객체를 받을 순 있음.
while(it.hasNext()) {
	String j = it.next();
	System.out.println(j + " ");
}

String 객체를 HashSet에 넣어보는 코드 

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

public class Ex09_07_HashSet {
	public static void main(String[] args) {
		
		HashSet<String> hs = new HashSet<String>();
		
		hs.add("banana");
		hs.add("ornage");
		hs.add("banana"); // 에러는 안나는데 중복이 허용되지 않기에 안들어간다
		hs.add("melon");
		
		System.out.println("데이터를 넣고 난 뒤 size: " + hs.size());
		System.out.println(hs); // hs.toString()
		System.out.println();
		
		//HashSet에는 get() 메서드가 없어서 일반 for 문으로는 요소 출력이 불가능하다.
		for(String s : hs) {
			System.out.println(s);
		}
		System.out.println();
		
		//Enumeration<String> en = hs.elements();
		//HashSet은 elements 메서드가 없어서 Enumeration 을 사용할 수가 없다.
		
		Iterator<String> it = hs.iterator(); // Iterator는 인터페이스임. 따라서 객체를 만들순 없지만, 객체를 받을 순 있음.
		while(it.hasNext()) {
			String j = it.next();
			System.out.println(j + " ");
		}
		System.out.println();
		
		hs.remove("ornage"); // 순서(index)가 없어서 인덱스를 입력하는 방식이 아닌 이 방법을 사용함
		System.out.println(hs);
		System.out.println();
		
		System.out.println(hs.contains("banana"));
		System.out.println(hs.isEmpty());
		System.out.println();
		
		//모든 요소를 싹 다 지우는 것
		hs.clear();
		System.out.println("clear 이후 size: " + hs.size());
	}
}

실행결과

데이터를 넣고 난 뒤 size: 3
[banana, ornage, melon]

banana
ornage
melon

banana 
ornage 
melon 

[banana, melon]

true
false

clear 이후 size: 0

HashSet을 이용해 중복없는 6개의 로또번호를 만들어내는 코드 

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

public class Ex09_08_HashSet {
	public static void main(String[] args) {
		
		//로또번호 발생시킬 때 중복되는 수는 무시하기 때문에 이게 더 간단한 방법이었음.
		HashSet<Integer> hs = new HashSet<Integer>();
		
		int cnt = 0;
		while(true) {
			int num = (int)(Math.random()*10) + 1;
			hs.add(num);		// 중복되는 숫자를 넣는거라면 시도해도 무시됨
			cnt++;
			if(hs.size() == 6)
				break;
		}
		
		System.out.println(hs); //hs.toString()은 원소들을 정렬된 상태로 출력해준다.
		System.out.println("중복없는 6개의 로또번호가 몇번만에 완성?: " + cnt);
		
		// Iterator도 정렬된 순서대로 뽑혀짐
		Iterator<Integer> it = hs.iterator(); // Iterator는 인터페이스임. 따라서 객체를 만들순 없지만, 객체를 받을 순 있음.
		while(it.hasNext()) {
			int j = it.next();
			System.out.print(j + " ");
		}
	}
}

실행결과

[1, 3, 4, 5, 7, 8]
중복없는 6개의 로또번호가 몇번만에 완성?: 10
1 3 4 5 7 8
Comments