JAVA

[JAVA] 컬렉션 프레임워크 _ Set컬렉션(HashSet, TreeSet)

(งᐛ)ว 2023. 9. 1. 00:03
728x90
728x90

HashSet

List와 다르게 중복값을 허용하지 않고 index가 없어 개별 요소에 접근불가

 

//HashSet 생성

HashSet<String> hs1 = new HashSet<>();

 

//HashSet에 데이터(요소)추가하기

hs1.add("b");

hs1.add("a");

hs1.add("f");

hs1.add("d");

System.out.println(hs1); //정렬기능없음

 

hs1.add("a");

hs1.add("b");

System.out.println(hs1); //중복되는 값의 추가 불가능

 

//Set에 들어있는 요소의 개수 확인하기

System.out.println("hs1의 요소의 개수 : "+hs1.size());

 

//Set에 해당요소가 들어있는지 검증하기

System.out.println("a의 유무 : "+hs1.contains("a")); //index가 없기때문에 꺼내올 수는 없음

 

//Set의 요소 제거하기

hs1.remove("f");

System.out.println(hs1);

 

//Set의 모든요소 제거하기

hs1.clear();

System.out.println(hs1);

 

 

++)hs1.removeAll(hs1)

//자료형이 boolean. 리스트의 모든 요소를 삭제하고 결과가 필요한 경우 사용. 잘 삭제되면 true를, 아니면 false반환. 출력문 안에 넣어서 쓴다. 


1️⃣1~45사이의 난수를 생성하여 6개 숫자 만들기

 

HashSet<Integer> hs2 = new HashSet<>();

 

while(true) {

     Random rnd = new Random();

     int randomNumber = rnd.nextInt(45)+1;

 

     hs2.add(randomNumber); //Set은 중복되지 않기때문에 중복검증을 하지 않아도되는 장점 

 

     if(hs2.size()==6) {

          break;

     }

}

System.out.println(hs2);

 

 

 

**Set을 배열형태로 변환하는 방법**

 

Integer[ ] arr = 해쉬셋객체명.toArray(new Integer[0]);


2️⃣ 컬렉션을 이용하여 5*5 랜덤 빙고판을 만들자. (1~50 사이의 난수 중 25개)

힌트) Set객체를 ArrayList로 변환하면 셔플메서드 사용 가능 

 

HashSet<Integer> set = new HashSet<>();

 

while (true) {

     Random rnd = new Random();

     int randomNumber = rnd.nextInt(50) + 1;

 

     set.add(randomNumber); //Set에 랜덤숫자 채우는데

 

     if (set.size() == 25) { //25개만

          break;

     }

}

System.out.println(set); //인덱스없는 Set상태->섞을 수 없음..

 

 

 

ArrayList<Integer> list = new ArrayList<>(set); //Set->List로 변경

System.out.println(list); //List상태

 

Collections.shuffle(list);

System.out.println(list); //List상태+섞기 완료

 

 

 

int n = 0; //외부변수

for (int i = 0; i < 5; i++) { //5*5 배열에 넣어주기위해

     for (int j = 0; j < 5; j++) { //이중for문 사용

          System.out.printf("%02d ",list.get(n++));

     }

     System.out.println();

}

 

 

**Set을 List형태로 변환하는 방법**

 

ArrayList<Integer> list = new ArrayList<>(set);

 


 

TreeSet

이진탐색트리 중에서도 성능을 향상시킨 레드-블랙트리로 구현되어있다. 

레드-블랙트리에서 부모노드보다 작은 값을 가지는 노드는 왼쪽으로, 큰 값을 가지는 노드는 오른쪽에 배치하여

데이터의 추가나 삭제시 트리가 한쪽으로 치우치지 않도록 균형을 맞춘다.

https://lrl.kr/IFdR

 

//TreeSet생성

TreeSet<Integer> set1 = new TreeSet<>();

**TreeSet<Integer> set2 = new TreeSet<>(Arrays.asList(1,2,3)); //초기값 지정한 TreeSet도 가능하다. 1,2,3이라는 요소를 가진 리스트를 만들어주겠다는 의미

 

//TreeSet에 값 추가하기

set1.add(7); //뿌리노드가 됨

set1.add(4);

set1.add(9);

set1.add(1);

set1.add(5);

System.out.println(set1);

 

//TreeSet의 크기 구하기

System.out.println("TreeSet의 크기 : "+set1.size());

 

//TreeSet의 요소 삭제하기

set1.remove(1); //값 1 제거

System.out.println(set1);

 

//모든 요소 제거하기

set1.clear();

System.out.println(set1);

 

 

//TreeSet의 요소 출력하기

TreeSet<Integer> set = new TreeSet<>(Arrays.asList(4,2,3,1,9));

System.out.println(set);

System.out.println(set.first()); //최소값 반환

System.out.println(set.last()); //최대값 반환

System.out.println(set.higher(3)); //인자보다 큰 데이터중 최소값, 없으면 null

System.out.println(set.lower(3)); //인자보다 작은 데이터중 최대값, 없으면 null

 

 

728x90