Set은 순서가 없는 집합이며 식별자(index or key)가 없다.
=> 방을 구분할 수 없다.
데이터 중복을 허용하지 않는다.
HashSet<String> set = new HashSet<>();
//1. 요소 추가
set.add("사과");
System.out.println(set.add("딸기"));
set.add("바나나");
System.out.println(set.add("딸기")); //중복을 허용하지 않아 무시됨 = boolean
//2. 요소 개수
System.out.println(set.size());
System.out.println(set);
System.out.println();
//3. 요소 읽기 > 방을 구분 불가능 > 원하는 요소 추출 불가능;
//- 읽기 도구 제공(중요*******) > iter == 향상된 for문
Iterator<String> iter = set.iterator();
//hasNext()는 가상의 커서가 다음 방의 값이 있는지 알려주는 것
//- 있으면 true, 없으면 false
System.out.println(iter.hasNext()); //true/false로 보여줌
System.out.println(iter.next());//요소를 보여줌
System.out.println(iter.hasNext()); //true/false로 보여줌
System.out.println(iter.next());//요소를 보여줌
System.out.println(iter.hasNext()); //true/false로 보여줌
System.out.println(iter.next());//요소를 보여줌
System.out.println(iter.hasNext()); //true/false로 보여줌
System.out.println(iter.next());//요소를 보여줌
while(iter.hasNext()) { //다음번에 데이터가 있는지 확인
System.out.println(iter.next());
}
//루프 종료 == iterator 모두 소비 (끝까지 탐색)
//System.out.println(iter.next()); //에러뜸 (소비가 다 끝나면 더이상 사용 못함)
//더 읽고 싶다면? => 새로 만들어야함
iter = set.iterator();
System.out.println(iter.next()); //사과 출력
//몇번이고 재호출이 가능
for(String item : set) {
System.out.println(item);
}
}
: set은 중복이 안되기 떄문에 로또 번호 같은 예제를 만들기 좋음!!
1. ArrayList 활용
Random rnd = new Random();
ArrayList<Integer> lotto = new ArrayList<>();
//for(;lotto.size()<6;)
while(lotto.size()<6){ //while 문을 쓰는게 나음
int n = rnd.nextInt(45)+1;
//기존 요소들과 중복 검사
if(check(lotto,n)) {
}else {
//중복x
lotto.add(n);
}
}
Collections.sort(lotto);
System.out.println(lotto);
System.out.println();
private static boolean check(ArrayList<Integer> lotto, int n) {
for(int i=0; i<lotto.size(); i++) {
if(lotto.get(i)==n) {
return true;
}
}
return false;
}
2. HashSet 활용
HashSet<Integer> lotto2 = new HashSet<>();
while(lotto2.size() < 6) { //size = 0~5
int n = rnd.nextInt(45)+1;
lotto2.add(n);
}
System.out.println(lotto2); //결과: [5, 6, 38, 7, 41, 25]
중복값을 제외하고 싶다면 Set을 쓰는 것이 좋다
하지만
순서가 없기 때문에 정렬을 할 수 없어 아래 코드는 에러가 뜬다.
Collections.sort(lotto2);
그럼에도 정렬을 하고 싶다면 list로 전환 !
(다음에 포스팅 할 TreeSet은 정렬이 자동으로 됨! 그 포스팅도 확인 해보기)
ArrayList<Integer> lotto3 = new ArrayList<Integer>(lotto2); //생성자에 set(lotto2)을 넣을 수 있음 !
//array와 set은 형제라 쌍뱡향으로 생성자에 사용가능! set을 만들때 array를 쓰면 중복 제거로 만들어 줌
Collections.sort(lotto3);
System.out.println(lotto3);