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
반응형
'small steps > 1일 1코딩 - 코딩을 내 몸처럼' 카테고리의 다른 글
[1일1코딩][Java] BufferedReader & StringTokenizer (0) | 2022.09.12 |
---|---|
22.09.12 운동기록 (0) | 2022.09.12 |
[1일1코딩][IDE] 인텔리제이 사용 및 익숙해지기 6th : 단축키 & 이전 문제해결 및 원인파악(이클립스 코드 끌어오기) (0) | 2022.09.11 |
[1일1코딩][Java] 배열(array ): 최대최소값 구하기 & 로또번호 랜덤생성 2nd (0) | 2022.09.10 |
[1일1코딩][Java] array : 최대최소값 구하기 & 로또번호 랜덤생성 (1) | 2022.09.09 |