Java 공부/자바 공부 (baek)

2021-09-17 Collection Set~

Hesitater 2021. 9. 17. 18:09
728x90

list 에서는 Arraylist 를 먼저 공부

Collection Set
- 순서를 유지하지 않고 저장 ( index가 없음 , ArrayList는 index() 가잇쥬?)
무엇을 꺼내려면 전체 검색을 하던가, 메소드를 사용해야함(API참조)
- 중복 저장 안됨
특별한 이유가 없으면 HashSet을 사용한다

p15collection.p03lecture.p02set;
class Ex02

Set // Set<저장하려고하는타입>

add() //set 에 아이템 추가
size() // set에 크기를 확인
contains() //set 안에 아이템 있나 없나 확인 true/false 값으로 나옴
remove(3); // set 안에 아이템 삭제

set1.retainAll(set2); //교집합 개념
set1.removeAll(set2); //차집합개념
set1.addAll(set2); //합집합 개념

set.add() // set에 존재 하지 않을때만 추가 합니당.

인덱스가 없기 떄문에
for( int = 0; i <set.size(); i++_ { ..} 이런형식 안되...
그럼 향상된 for문으로...

// 향상된 for 출력될때 출력 순서 보장이 안됨
for ( int item : set ) {
System.out.println(item);
}

set.contains(3); // set 안에 아이템 있나 없나 확인 true/false 로나옴

Ex02

결과값

quiz02set

Ex01
// 파라미터 arr의 값들을 저장한 HashSet 객체를 리턴

Ex01

Ex01Test

Ex02

// 문자열 arr의 값들을 저장한 HashSet 객체를 리턴

Ex02

Ex02Test

Ex03
// arr 배열에 중복된 값들만 set에 모아서 리턴

index 번호가 없어서 for문으로 안되...
set, result 생성하고 set안에 e 있으면 result 에 넣고
set 안에 e가 없으면 set 안에 넣는다.

Ex03

Ex03 sort 이용(Integer)

Ex03Test

Ex04
// 문자열 배열에 중복된 값들만 set에 모아서 리턴

Ex04

Ex04Test

Ex05
// * str에 몇 개의 문자가 사용되었는지 return
ex) cap - 3개
java - 3개

set이 중복 안되니깐 문자열을 charAt

set의 배열된거를 배열에 넣고
거기서 charAt을 사용해서 문자열을 뺴보자

char를 set에 담아서 (중복된건 저장 안되겟죠?)
그다음 size를 리턴
charAt생각했는데.. .생각만했네...

Ex05

Ex05Test

Ex06
// 몇개의 문자가 중복이 되었는지..

이거 만들떄 Ex03, Ex05 짬뽕시켜서했음

Ex06 선생님이

선생님은
char c= str.charAt(i); 질러놓고 if문에서 사용 한거 같음
보기좋네...

EX06 내가 짬뽕

Ex06Test

Ex07
// 한번만 사용된 문자의 개수

set은 중복되지 않은 값을 저장
한번만 쓴걸 set에 넣어야하네
그럼 두번 이상쓴게 나오면 제거 하면 되니?

Ex07

        Set<Character> set = new HashSet<>();
        Set<Character> db = new HashSet<>();

        for ( int i = 0; i < str.length(); i++) {

            if(set.contains(str.charAt(i))) {
                db.add(str.charAt(i));
            } else {
                set.add(str.charAt(i));
            }

        }

            for ( char a : set) {
                if(db.contains(a)) {
                    set.remove(a);
                }

            }

        return set.size();

        이렇게했는데 ConcurrentModificationException 이일어나는데
        예외가 일어나는 이유가 이 예외는 어떤 쓰레드가 Iterator가 반복중인 Collection을 수정하는 경우 발생한다. 
        어떤 쓰레드는 현재 반복문이 실행하고있는 쓰레드일 수도 있고, 전혀 다른 쓰레드일 수도 있다 이라고하는데

Ex07 위에 문제를 Iterator를 사용해서 ConcurrentModificationException 해결

ConcurrentModificationException 나는 이유가 set.remove를 써서 그렇다고함

그래서 Iterator.remove()를 써야한다고함 그냥 쓰지말자..

그나마 설명

Ex07Test

Ex03Iterator
// 교재 735쪽
// Iterator 열거자, 반복자
// 주요메소드 : hasNext(), next()

다음에 탐색할께 있는지 확인한 뒤에 next()메소드로 읽어내면되용

이미 탐색할께 없어서 출력이 안됨

iterator = set.iterator();
다시 써야 사용 가능

if를 while문으로 바꾸면 e1~e5까지 나오가 e6이 없으니깐 false가 떠서 while문을 빠져나옴

("==========List Iterator===========");

List라 순서도 보장 중복도 보장 탐색할 용도로 많이 사용

결과값

교재737쪽

HashSetExample1

결과값

Ex04 Equals

11장API 에서 봤었던..

class Car 관련

class Car 에서 필드값이 같으면 같은 객체를 판단을(메서드 재정의)를 안해서
길이가 4가 나옴

결과값

필드값이 같으면 같은 객체를 판단 하고싶으면

Source(Alt + shilf + s) 에서 Generate hashCode() and equals(); 선택

hashCode 출력문+알파

결과값

교재777쪽 8번

Generate hashCode() and equals(); 사용해서
StudentNum 필드만 필요하니 StudentNum 필드만 사용해서 사용

//학번이 같으므로 저장되지 않게 하고싶엉

HashSetExample

Student

Ex08

public Set diff(int[] a, int[] b) {
// a배열에만 있는 원소들 아이템들만 모은 set 리턴

return null;
}

선생님 이 해주신거 diff

diff2 a배열에만 있는 원소들 아이템들만 모은 set 리턴

내가 할떄 exception 나서 Iterator 로 해서했음 Eㅌ

  public Set<Integer> diff2(int[] a, int[] b) {
        Set<Integer> setA = new HashSet<>();
        Set<Integer> setB = new HashSet<Integer>();

        for (int item : a) {
            setA.add(item);
        }
        for (int item : b) {
            setB.add(item);
        }

        Iterator<Integer> iterator = setA.iterator();
        while (iterator.hasNext()) {
            if (setB.contains(iterator.next())) {
                iterator.remove();
            }

        }
        return setA;

Iterator 기억하기..

'Java 공부 > 자바 공부 (baek)' 카테고리의 다른 글

2021-09-24  (0) 2021.09.24
2021-09-23 Map~  (0) 2021.09.23
2021-09-16  (0) 2021.09.16
2021-09-15 15장 컬렉션 프레임워크01  (0) 2021.09.15
2021-09-15 p.654제네릭 맛만보기  (0) 2021.09.15