성수연_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가 나오도록 했기 때문.