이런 상황을 가정해보겠습니다.
어떤 웹 사이트에서 하루에 접속하는 사람들 수를 구하고자 합니다.
접속하는 IP를 세면 되겠죠.
근데 한사람이 여러번 접속하면 한 IP가 여러번 찍힐 것입니다.
이건 한번으로 카운트 해줘야 제대로 된 접속자 수를 구할 수 있습니다.
이럴 때 쓰는게 Set입니다.
그냥 수학에서 집합 이라고 보시면 됩니다.
Set은 순서를 신경쓰지 않습니다.
데이터가 존재하냐 안하냐만이 중요합니다.
HashSet
TreeSet
LinkedHashSet
순서가 필요없는 데이터를 hash table에 저장. Set 중에 가장 성능이 좋음
저장된 데이터의 값에 따라 정렬됨. red-black tree 타입으로 값이 저장. HashSet보다 성능이 느림
연결된 목록 타입으로 구현된 hash table에 데이터 저장. 저장된 순서에 따라 값이 정렬. 셋 중 가장 느림
public class Test {
public static void main(String[] args) {
Test t = new Test();
String[] alphabet = new String[] {
"A", "B", "A", "D", "C", "E", "F", "G", "E",
"T", "M", "O"
};
System.out.println(t.getAlphabetKinds(alphabet));
// A B C D T E F G M O
// 10
System.out.println(t.getAlphabetKinds2(alphabet));
// A B C D T E F G M O
// 10
}
public int getAlphabetKinds(String[] alphabet) {
if(alphabet == null) return 0;
if(alphabet.length == 1) return 1;
HashSet<String> alphabetSet = new HashSet<>();
for(String spell: alphabet) {
alphabetSet.add(spell);
}
for(String item: alphabetSet) {
System.out.println(item + " ");
}
System.out.println();
return alphabetSet.size();
}
public int getAlphabetKinds2(String[] alphabet){
if(alphabet == null) return 0;
if(alphabet.length == 1) return 1;
Set<String> alphabetSet2 = new HashSet<>();
for(String spell: alphabet){
alphabetSet2.add(spell);
}
for(String item: alphabetSet2){
System.out.print(item + " ");
}
System.out.println();
return alphabetSet2.size();
}
}