728x90

 

set은 list랑 다르게 인덱스가 없어서 인덱스 관련 메소드들이 없다

indexOf(), get(), set() 등등

인덱스가 없어서 순서도 없다. 순서 있는 LinkedHashSet도 인덱스가 없기 때문에 사용 불가

map도 마찬가지로 인덱스가 없어서 set처럼 사용불가

 

인덱스가 없기 때문에 for문도 사용 불가능하고 

이는 for문과 인덱스를 통해 해당 엘리먼트에 접근 가능하던게 불가능하다는 뜻인데

이를 보완하기 위해 Iterator를 사용한다

Iterator + hasNext() + while문으로 컬렉션 내부 엘리먼트에 접근 가능

 

public void method04(){


        // 공용 메소드들
        // add(E e):boolean
        // contains(Object o) : boolean
        // iterator() : Iterator<E>
        // remove(Object o) : boolean
        // size() : int
        // equals(Object o) : boolean
        // isEmpty() : boolean
        // clear() : void

        // HashSet
        HashSet<Dog> hSet = new HashSet<Dog>();
        hSet.add(new Dog("풍이",10));
        hSet.add(new Dog("해피",10));
        System.out.println(hSet);   // [풍이(10.0kg), 해피(10.0kg)]


        // 순서x 중복x HashSet, add하면 어디에 추가될까?
        // 위치는 랜덤
        hSet.add(new Dog("뚱이",10));
        System.out.println(hSet); // 마지막 추가 : [풍이(10.0kg), 해피(10.0kg), 뚱이(10.0kg)] 
        hSet.add(new Dog("호야",10));
        System.out.println(hSet); // 중간 추가 : [풍이(10.0kg), 해피(10.0kg), 호야(10.0kg), 뚱이(10.0kg)]

        // set 중복 저장안되는데 중복 저장 되는 이유 : equals() 오버라이딩 안되어있어서
        hSet.add(new Dog("뚱이",10));
        System.out.println(hSet);              // [풍이(10.0kg), 해피(10.0kg), 호야(10.0kg), 뚱이(10.0kg)]
        // equals() 오버라이딩 주석처리하면 중복 가능 : [풍이(10.0kg), 해피(10.0kg), 호야(10.0kg), 뚱이(10.0kg), 뚱이(10.0kg)]

        // LinkedHashSet
        // 순서가 유지o 중복저장x 안되는 컬렉션
        LinkedHashSet<Dog> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.addAll(hSet);
        System.out.println("linkedHashSet : " +linkedHashSet); // [풍이(10.0kg), 해피(10.0kg), 호야(10.0kg), 뚱이(10.0kg)]

        // LinkedHashSet 순서가 있으니까 add로 추가하면 어디서부터 추가될까?
        // 뒤부터 추가
        linkedHashSet.add(new Dog("도리",10));
        linkedHashSet.add(new Dog("아리",10));
        System.out.println(linkedHashSet); // [풍이(10.0kg), 해피(10.0kg), 호야(10.0kg), 뚱이(10.0kg), 도리(10.0kg), 아리(10.0kg)]

        // contains()
        // 값 비교 메소드 필요
        System.out.println(linkedHashSet.contains(new Dog("풍이",10))); // true
        // 오버라이딩 메소드 주석처리하면 false

        // size() : int
        linkedHashSet.size();
        System.out.println(linkedHashSet.size()); // 6

        // remove(Object o) : boolean
        // removeAll(Collection<?> c ) : boolean
        // Collection<?> c는 해당 컬렉션 변수 통째로 넣는 걸 의미 : ex)HashSet의 변수명 hSet
        linkedHashSet.remove(new Dog("아리",10));
        System.out.println(linkedHashSet);
        linkedHashSet.removeAll(linkedHashSet); // [풍이(10.0kg), 해피(10.0kg), 호야(10.0kg), 뚱이(10.0kg), 도리(10.0kg)]
        System.out.println(linkedHashSet); // []

        // isEmpty() : boolean
        linkedHashSet.isEmpty();
        System.out.println(linkedHashSet.isEmpty()); // true

        // equals(Object o) : boolean
        System.out.println(hSet); // [풍이(10.0kg), 해피(10.0kg), 호야(10.0kg), 뚱이(10.0kg)]
        hSet.equals(new Dog("풍이",10));
        System.out.println(hSet.equals(new Dog("풍이",10))); // false


        // clear() : void
        hSet.clear();
        System.out.println(hSet); // []

        // 공용 메소드들
        // add(E e):boolean
        // contains(Object o) : boolean
        // iterator() : Iterator<E>
        // remove(Object o) : boolean
        // size() : int
        // equals(Object o) : boolean
        // isEmpty() : boolean
        // clear() : void


        // TreeSet
        // 정렬을 해주는 Set
        TreeSet<Dog> treeSet = new TreeSet<>();

        System.out.println(treeSet); // []
        treeSet.add(new Dog("멍뭉이",10));
        System.out.println(treeSet); // [멍뭉이(10.0kg)]
        treeSet.clone();
        System.out.println(treeSet); // [멍뭉이(10.0kg)]

        // remove(int index):E
        // remove()의 return은 삭제한 값을 돌려준다
        // set은 인덱스가 없으므로 위의 인덱스 번호로 지우는 것은 불가능. 따로 해당 메소드는 set과 map에는 없음
//        System.out.println(treeSet.remove(1)); Exception in thread "main" java.lang.ClassCastException


        // remove(Object o):boolean
        // 같은 데이터라면 앞에 있는거부터 삭제
        // equals()가 오버라이딩이 안되어 있어서 값 비교가 아니라 주소값 비교라 삭제 못한 것.
        System.out.println(treeSet.remove(new Dog("멍뭉이",10))); //  true
        System.out.println(treeSet); // []

        treeSet.add(new Dog("멍뭉이",15));
        System.out.println(treeSet);


        // Iterator<E>	iterator()
        Iterator<Dog> it = treeSet.iterator();
        System.out.println(it); // java.util.TreeMap$KeyIterator@1b6d3586

        System.out.println(it.equals(new Dog("멍뭉이",15))); // false
        // 왜 false일까...?
        while(it.hasNext()){
            Dog d = it.next();
            System.out.println("iterator : "+it); // iterator : java.util.TreeMap$KeyIterator@1b6d3586
//            System.out.println(it.next());  // Exception in thread "main" java.util.NoSuchElementException
            System.out.println("Dog d : "+d); // Dog d : 멍뭉이(15.0kg)
        }
        

//        인텔리제이가 자동생성 해준 이터레이터 코드
//        Iterator<Dog> iterator = new Iterator<Dog>() {
//            @Override
//            public boolean hasNext() {
//                return false;
//            }
//
//            @Override
//            public Dog next() {
//                return null;
//            }
//        };


        // hSet.set();
        // linkedHashSet.set();
        // treeSet.set();
        // 위의 셋 다 set(),get()가 없음 -> 인덱스 번호로 replace해주기 때문
        //      set(int index, E e) : 바꾸기 전 값 반환
        //      해당 인덱스 번호에 값  교체
        //      get(int index):E
        //      인덱스번호의 엘리먼트 값을 가져온다

        // contains(Object) : boolean
        System.out.println(treeSet.contains(new Dog("멍뭉이",15))); // true

        // clear():void
        treeSet.clear();
        System.out.println(treeSet); // []

        // isEmpty():boolean
        System.out.println(treeSet.isEmpty()); // true


    }
728x90
반응형

+ Recent posts