콜렉션과 Set 클래스
코딩테스트 문제를 풀면서 배열의 중복 값을 어떻게 없앨지 고민하다가 인터넷에서 배열의 중복 제거 알고리즘을 알아
보고 적용시켜서 배열 자체에서 중복을 제거했었는데 다른사람들의 풀이를 보니 Set클래스를 사용하면 요소의 중복을
막을 수 있는 것을 알게 되었다.먼저 Set을 알아보기 전에 Collection에 대해 간단히 집고 넘어가자.
CollectionFramework이란 데이터를 효율적으로 다루기 위한 클래스들의 집합이라 할 수 있는데
프로그래밍에서 데이터를 저장할 때 어떤 형태로 저장하는 것이 효율적일지 고려하는 자료 구조를 뜻한다.
Set클래스는 Collection 인터페이스를 구현해서 나온 클래스인데 따라서 Collection method를 사용할 수 있다.
메소드 | 설명 |
boolean add() | 요소를 컬렉션에 추가 |
boolean contains() | 객체가 컬렉션에 존재하는지 여부 |
boolean isEmpty() | 컬렉션이 비어있는지 여부 |
Iterator iterator() | 컬렉션의 iterator 객체를 반환 |
boolean remove() | 객체를 제거 |
int size() | int length의 컬렉션 버전 |
다음과 같은 메소드를 기본 기능으로 사용할 수 있다.
이제 Set에 대해 알아보자 사전적 의미로는 집합이라는 뜻으로 요소를 집합적으로 모아둔 자료구조다.
Set은 재밌는 특징이 한가지 있는데 바로 요소들의 중복을 제거하는 특징이다.
int 나 string같이 같은 value를 가지면 자체적으로 중복을 제거한다. 단 저장 순서를 보장하지는 않는데
Set를 상속한 HashSet에서는 저장 순서를 보장하지 않지만 TreeSet에서는 순서를 보장한다.
코드로 한번 알아보자
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.util.TreeSet;
import java.util.HashSet;
import java.util.Iterator;// 해당 컬렉션의 iterator를 반환하는 기능을 가짐 iterator : 반복기
public class PracticeSet {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<Integer> hs = new HashSet<Integer>();
HashSet hsS = new HashSet();
TreeSet ts = new TreeSet();
|
cs |
java utill에서 필요한 클래스를 import하고
객체 생성을 해준다. 이때 콜렉션의 데이터 타입을 명시해 줄 수 있는데
hashset은 integer와 String을 generic으로 갖는
2개의 객체를 생성했고 treeset은 String 한개만 생성해줬다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
hs.add(7);
hs.add(2);
hs.add(10);
hs.add(4);
hs.add(2);
Iterator it = hs.iterator();
while(it.hasNext()) {
System.out.println(it.next());//hashset이 오름차순으로 정렬된다?
}
|
cs |
먼저 Integer 타입의 hashset 보자 크기의 순서에 상관없이 정수 값을 저장했고 iterator를 사용해서
값을 출력해봤다. 위에서 설명한대로라면 크기와 관계없이 무작위로 정렬되었을 것 같지만 결과값을
보면
오름차 순으로 정렬되었음을 알 수 있다.
일단 계속 가보자.
1
2
3
4
5
6
7
8
9
10
11
12
|
hsS.add("apple");
hsS.add("mango");
hsS.add("watermelon");
hsS.add("banana");
Iterator itS = hsS.iterator();
while(itS.hasNext()) {
System.out.println(itS.next());//
}
|
cs |
String 타입의 hashset에 과일 이름을 넣어봤다. 결과값을 보면
이번에는 알파벳 순서에 상관 없이 저장된 모습을 볼 수 있었다. 관련 내용을 참고해봤는데 개인적인 생각과
결론만 말하자면
d2.naver.com/helloworld/831311
hashset은 정렬 순서를 보장을 못한다는 것이지 랜덤으로 값이 저장된다는 말은 아니다.
단순한 구조는 treeset처럼 정렬이 될 수 있다.
다만 프로그래밍에서는 구조가 명확해야 하므로
확실하게 정렬이 필요하다면 treeset을 사용해야 할 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
ts.add("apple");
ts.add("mango");
ts.add("watermelon");
ts.add("banana");
Iterator itt = ts.iterator();
while(itt.hasNext()) {
System.out.println(itt.next());//
}
|
cs |
이번에는 스펠링 순으로 정렬된 것을 볼 수 있다.