반응형

 

HashSet

 

= 집합

 

: Set 인터페이스에서 지원하는 구현 클래스로 비선형 구조이기에 순서와 인덱스가 존재하지 않는다.

 

- 특징

1. 중복된 값을 포함하지 않는다.

2. 인덱스 개념이 존재하지 않는다. => 수정 시 삭제 후 추가하여 진행해야 한다.

3. 데이터의 순서를 보장하지 않는다.

 

 

  • 사용법
사용법
add() 데이터 추가
Iterator 이름 = Set이름.iterator() 데이터 접근을 위한 객체 (get이 존재하지 않음)
hasNext() Iterator의 다음 데이터가 있는지 확인
next() Iterator의 다음 데이터 가져오기
remove() 데이터 삭제
clear() 전체 데이터 삭제
size() 데이터 개수 확인

 

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class T05HashSetTest {
	public static void main(String[] args) {
		
		Set hs1 = new HashSet();
		
		// Set 에 데이터를 추가할 때에도 add() 사용한다.
		hs1.add("DD");
		hs1.add("AA");
		hs1.add(2); // int 값이 integer 값으로 들어감 => 기본 타입의 데이터가 객체 타입으로 들어감. (래퍼 클래스)
		hs1.add("CC");
		hs1.add("BB");
		hs1.add(1); // 모든 걸 다 객체화 시킴 => 변환이나 이용이 편리함
		hs1.add(3);
		
		System.out.println("Set 데이터 : " + hs1);
		
		// Set은 데이터 중복을 허용하지 않는다.
		// 그래서 이미 존재하는 데이터를 또다시 추가하면
		// false를 반환하고, 데이터는 추가되지 않는다.
		boolean isAdded = hs1.add("FF");
		System.out.println("중복 되지 않을 때 : " + isAdded);
		System.out.println("Set 데이터 : " + hs1);
		System.out.println();
		
		isAdded = hs1.add("CC");
		System.out.println("중복 될 때 : " + isAdded);
		System.out.println("Set 데이터 : " + hs1);
		System.out.println();
	
		// Set의 데이터를 수정하려면 수정하는 메서드가 따로 존재하지 않기 때문에
		// 해당 데이터를 삭제 후 새로운 데이터를 추가해 주면 된다.
		
		
		// 데이터 삭제하기
		// 1) clear() => 모든 데이터 삭제
		// 2) remove(삭제할 데이터) => 해당 데이터 삭제
		
		// 'FF'를 'EE'로 수정하기
		hs1.remove("FF"); // FF 삭제
		System.out.println("FF 삭제 후 Set 데이터 : " + hs1);
		System.out.println();
		
		hs1.add("EE");
		System.out.println("EE 추가 수 Set 데이터 : " + hs1);
		System.out.println();
		
//		hs1.clear(); // 전체 데이터 삭제
//		System.out.println("clear() 후 Set 데이터 : " + hs1);
		
		System.out.println("Set의 데이터 개수 : " + hs1.size());
		System.out.println();
		
		
		// Set은 인덱스 개념이 존재하지 않기 때문에 List처럼 인덱스로 데이터를 하나씩 불러올 수 없다.
		// 그래서 데이터를 접근하기 위해서 Iterator 객체를 사용해야 한다.
		
		Iterator it = hs1.iterator(); // get이 없기에 사용
		
		// 데이터 개수만큼 반복하기
		// 데이터의 순서를 보장하지 않음
		while(it.hasNext()) { // 다음 데이터가 있는지 확인
			System.out.println(it.next()); // 다음 데이터 가져오기
		}
	}
	
}

 

Set 예시 결과 화면

 

 

 

  • TIP : Collection 유형의 객체 이용
더보기

Collection 유형의 객체들은 서로 다른 자료 구조로 쉽게 변경해서 사용할 수 있다.
다른 유형의 객체를 생성할 때 생성자에 해당 데이터를 넣어주면 된다.

 

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class T05HashSetTest {
	public static void main(String[] args) {
    
		// 1 ~ 100 사이의 중복되지 않는 정수 5개 만들기
		Set<Integer> intRnd = new HashSet<Integer>();
		
		while (intRnd.size() < 5) {
			int num = (int) (Math.random() * 100 + 1);
			intRnd.add(num);
		}
		
		System.out.println("생성된 난수들 : " + intRnd);
		
		// Collection 유형의 객체들은 서로 다른 자료 구조로 쉽게 변경해서 사용할 수 있다.
		// 다른 유형의 객체를 생성할 때 생성자에 해당 데이터를 넣어주면 된다.
		List<Integer> intRndList = new ArrayList<Integer>(intRnd);

		System.out.println("intRndList 데이터 출력 : ");
		
		for(Integer num : intRndList) {
			System.out.print(num + " ");
		}
		System.out.println();
	}
}

 

 

Collection 유형의 객체 이용 결과 화면

 

 

 

- Tree Set

 

: 트리 형태로 관리하는 Set (자료구조)를 말한다.

데이터를 검색할 때 검색 속도가 빠르다는 장점이 존재한다.

그러나 정렬이 되어 있어야 사용할 수 있다. => Tree Set에서 데이터 저장 시 자동정렬을 한다.

 

 

  • 사용법
사용법
SortedSet<객체타입> 이름 원소들이 정렬되어 있는 Set
headSet(기준값) 기준값 미포함 + 이전 자료
(기준값, true) => 기준값 포함 + 이전 자료
tailSet(기준값) 기준값 포함 + 이후자료
tailSet(기준값, false) => 기준값 미포함 + 이후자료
subSet(기준값1, 기준값2)
subSet(기준값1, true, 기준값2, false)
기준값1 <= 값 < 기준값2

subSet(기준값1, true, 기준값2, true) => 기준값1 <= 값 <= 기준값2
subSet(기준값1, false, 기준값2, false) => 기준값1 < 값 < 기준값2
subSet(기준값1, false, 기준값2, true) => 기준값1 < 값 <= 기준값2

 

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

public class T06TreeSetTest {
	public static void main(String[] args) {
		
		// TreeSet은 데이터 저장시에 자동정렬 기능이 들어가 있다.
		TreeSet<String> ts = new TreeSet<String>();
		
		List<String> abcList = new ArrayList<String>();
		
		// 영어 대문자를 문자열로 변환하여 List에 저장
		for(char ch = 'A'; ch <= 'Z'; ch++) {
			String temp = String.valueOf(ch);
			abcList.add(temp);
		}
		
		Collections.shuffle(abcList);
		
		System.out.println("섞은 후 abcList : " + abcList);
		
		for(String str : abcList) {
			ts.add(str);
		}
		
		System.out.println("TreeSet 데이터 : " + ts);
	}
}

 

결과 화면1

 

 

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

public class T06TreeSetTest {
	public static void main(String[] args) {
		
		// TreeSet은 데이터 저장시에 자동정렬 기능이 들어가 있다.
		TreeSet<String> ts = new TreeSet<String>();
		
		for(char ch = 'A'; ch <= 'Z'; ch++) {
			String temp = String.valueOf(ch);
			ts.add(temp);
		}
		System.out.println("TreeSet 데이터 : " + ts);
		System.out.println();
		
		// TreeSet에 저장된 자료 중 특정한 값보다 작은 자료를 찾아서 SorredSet으로 반환해주는 메서드
		// => headSet(기준값) : 기본적으로 '기준값'은 포함시키지 않는다.
		// => headSet(기준값, 논리값) : '논리값'이 true이면 '기준값'을 포함시킨다.
		SortedSet<String> ss1 = ts.headSet("K");
		System.out.println("K 이전 자료 : " + ss1);
		System.out.println("K 이전 자료 (기준값 포함) : " + ts.headSet("K", true));
		
		// '기준값'보다 큰 자료를 찾아 SortedSet으로 반환해 주는 메서드
		// tailSet(기준값) : 기본적으로 '기준값'을 포함시킨다.
		// tailSet(기준값, 논리값) : '논리값'이 false이면 '기준값'을 포함시키지 않는다.
		SortedSet<String> ss2 = ts.tailSet("K");
		System.out.println("K 이후 자료 : " + ss2);
		System.out.println("K 이후 자료 (기준값 미포함) : " + ts.tailSet("K", false));
		
		// subSet(기준값1, 기준값2) : 기준값1 ~ 기준값2 사이의 값을 가져온다. ('기준값1' 포함, '기준값2' 미포함)
		// subSet(기준값1, 논리값1, 기준값2, 논리값2) : 각 기준값 포함여부를 각 논리값으로 결정한다.
		System.out.println("K(포함)부터 N(미포함)까지 : " + ts.subSet("K", "N"));
		System.out.println("K(포함)부터 N(포함)까지 : " + ts.subSet("K", true, "N", true));
		System.out.println("K(미포함)부터 N(미포함)까지 : " + ts.subSet("K", false, "N", false));
		System.out.println("K(미포함)부터 N(포함)까지 : " + ts.subSet("K", false, "N", true));
		
	}
}

 

결과 화면2

 

 

반응형

'자바' 카테고리의 다른 글

[Java 고급] 3.5.1장 Test1  (1) 2024.01.27
[Java 고급] 3장 Hash 함수(Map)  (1) 2024.01.27
[Java 고급] 1.5장 Test  (0) 2024.01.27
[Java 고급] 1장 Collection Framework와 List  (1) 2024.01.27
[Java 초급] 28장 MVC 패턴6 : 영화 예매  (0) 2024.01.10