///////
Search
📐

Set

성수연_1006

Set

저장 순서가 없어 저장할 때의 순서대로 출력할 수 없음
중복을 허용하지 않음

Set의 종류

HashSet
저장 순서를 유지하지 않음 (유지하려면 LinkedHashSet 사용)
인덱스 없음
HashMap과 달리 중복을 허용하지 않음
TreeSet
정렬된 위치에 저장
이진 탐색 트리 구조
추가,삭제 시간이 조금 걸리지만 정렬, 검색에는 유리

HashSet

HashSet 변수 선언
HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();
HashSet<Integer> set = new HashSet<Integer>(); HashSet<String> set2 = new HashSet<String>();
JavaScript
복사
HashSet 값 추가
add(value) 메소드를 사용
추가되는 값은 HashSet<데이터타입>의 맞는 데이터만 추가
예시 코드
HashSet값 삭제
remove(value) 메소드르 사용하여 원하는 value값만 삭제
전부 삭제 → clear메소드를 사용
예시 코드
HashSet의 크기 구하기
size메소드를 사용
중복값이 들어올 경우 자동으로 제거됨
예시 코드
중복 걸러내는 과정
먼저 객체의 해시코드 메소드를 호출해서 코드를 얻는다
저장되어있는 객체들의 해시코드와 비교
같은 해시코드가 있다면 두 객체를 비교 후 true가 나오면 동일한 객체로 판단 -> 중복 저장 하지 않음.
문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String객체는 동일한 객체로 간주되고 다른 문자열을 갖는 String객체는 다른 객체로 간주.
그 이유는 String 클래스가 해시코드와 equals 메소드를 재정의해서 같은 문자열일 경우 해시코드의 리턴값을 같게, equals의 리턴값은 true가 나오도록 했기 때문.

서정희_1006

실습 예제

0.SetExercise

문자열과 숫자를 각각 저장하는 set을 만들고 중복되는 데이터를 add해본다.
→ 중복되는것은 저장되지 않는것을 볼 수 있다.
import java.util.HashSet; import java.util.Set; public class SetExercise { public static void main(String[] args) { Set<String> set1 = new HashSet<>(); set1.add("김경록"); set1.add("김경록"); //중복으로 들어가지 않음 Set<Integer> setInteger = new HashSet<>(); setInteger.add(1); setInteger.add(1); setInteger.add(2); setInteger.add(2); System.out.println(setInteger); } }
Java
복사

1.RandomNumberGenerator

임의의 숫자를 50개 생성하고, 중복되는 것은 제외하여 HashSet에 저장한뒤 이를 출력한다.
RndNumsWithoutDupl은 RandomNumberGenerator를 사용한다.
RandomNumberGenerator는 NumberGenerator를 implement한다.
숫자 생성을 위한 인터페이스
public interface NumberGenerator { int generate(int num); //숫자를 생성하는 메소드 }
Java
복사
숫자 생성을 위한 인터페이스를 상속받고 num미만의 랜덤한 숫자를 생성하도록 구현한다.
public class RandomNuberGenerator implements NumberGenerator{ @Override public int generate(int num) { return (int)(Math.random()*num); //num 미만의 랜덤한 숫자를 생성하여 리턴한다. } }
Java
복사
import java.util.HashSet; import java.util.Set; public class RndNumbersWithoutDuplicated { public static void main(String[] args) { RandomNuberGenerator randomNuberGenerator = new RandomNuberGenerator(); HashSet<Integer> numbers = new HashSet<>(); for(int i=0;i<50;i++){ int r= randomNuberGenerator.generate(10); numbers.add(r); //값이 중복된다면 또다시 저장하지 않는다. } System.out.println(numbers); System.out.println(numbers.size()); } }
Java
복사

2.RandomAlphabetGenerator

A~Z(대문자 알파벳) 중 임의의 알파벳을 50개 생성한뒤 이를 중복없이 저장하고 출력한다.
문자 생성을 위한 인터페이스
public interface Generator { char generate(); }
Java
복사
public interface Generator<T>{ T generate(int num); }
Java
복사
문자외에도 숫자 등 여러 자료형의 값을 생성할 수 있게하기 위해 Generator를 사용할수도 있다.
대문자 알파벳을 랜덤하게 생성한다.
char c = (char) ( Math.random()*26+65); 과 같이 쓴 이유?
public class AlphabetGenerator implements Generator { @Override public char generate() { char c = (char) ( Math.random()*26+65); return c; } }
Java
복사
랜덤 숫자 생성기와 같은 원리로 동작한다.
import java.util.HashSet; public class RandomAlphabet { public static void main(String[] args) { AlphabetGenerator alphabetGenerator = new AlphabetGenerator(); HashSet<Character> alphabets = new HashSet<>(); for(int i=0;i<50;i++){ char r= alphabetGenerator.generate(); alphabets.add(r); } System.out.println(alphabets); System.out.println(alphabets.size()); } }
Java
복사
HashSet 변수 선언
HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();
Plain Text
복사
출처:
[차근차근 개발일기+일상:티스토리]
HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();
HashSet<Integer> set = new HashSet<Integer>(); HashSet<String> set2 = new HashSet<String>();
JavaScript
복사
HashSet 값 추가
add(value) 메소드를 사용
추가되는 값은 HashSet<데이터타입>의 맞는 데이터만 추가
예시 코드
HashSet값 삭제
remove(value) 메소드르 사용하여 원하는 value값만 삭제
전부 삭제 → clear메소드를 사용
예시 코드
HashSet의 크기 구하기
size메소드를 사용
중복값이 들어올 경우 자동으로 제거됨
예시 코드
중복 걸러내는 과정
먼저 객체의 해시코드 메소드를 호출해서 코드를 얻는다
저장되어있는 객체들의 해시코드와 비교
같은 해시코드가 있다면 두 객체를 비교 후 true가 나오면 동일한 객체로 판단 -> 중복 저장 하지 않음.
문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String객체는 동일한 객체로 간주되고 다른 문자열을 갖는 String객체는 다른 객체로 간주.
그 이유는 String 클래스가 해시코드와 equals 메소드를 재정의해서 같은 문자열일 경우 해시코드의 리턴값을 같게, equals의 리턴값은 true가 나오도록 했기 때문.