기록하는 습관을 들이자

Java Set (Set 인터페이스, HashSet, TreeSet, LinkedHashSet) 본문

알고리즘/Java

Java Set (Set 인터페이스, HashSet, TreeSet, LinkedHashSet)

myeongmy 2020. 4. 5. 13:14
반응형

이번에는 Set에 대해 알아보려고 한다.

 

Set은 말그대로 집합을 의미하며 중복된 원소를 포함하지 않는다!

 

즉, 알고리즘 구현 시 중복을 제거해야할 때 사용된다.

 

Set 인터페이스 상속 구조

 

Set 자체는 인터페이스이고, 이를 상속한 HashSet, LinkedHashSet, TreeSet 등 다양한 클래스가 있다!

각각의 특징을 알아보자.

 

 

1. HashSet (중복 제거, 순서 보장 X)

 

HashSet은 Set의 특성인 중복 제거가 가능하지만, 나중에 출력 시 원소가 출력되는 순서는 랜덤이다.

 

HashSet<Integer> hs = new HashSet<Integer>();

hs.add(1);
hs.add(3);
hs.add(1);
hs.add(4);

Iterator<Integer> it = hs.iterator();

while(it.hasNext()){
	System.out.println(it.next);
}


//결과
3
1
4

 

2. TreeSet (중복 제거, 오름 차순 반환)

 

TreeSet 클래스는 요소 반환 시 a-z, 1-9의 오름차순으로 요소를 반환해준다는 것이 특징이다!

TreeSet<String> ts = new TreeSet<String>();

ts.add("3");
ts.add("2");
ts.add("5");
ts.add("2");

Iterator<String> it = ts.iterator();

while(it.hasNext()){
	System.out.println(it.next());
}

//결과
2
3
5

 

3. LinkedHashSet (중복 제거, 들어온 순서대로 반환)

 

LinkedHashSet 클래스는 집합에 입력된 순서대로 요소를 반환한다!

 

LinkedHashSet<String> lhs = new LinkedHashSet<String>();

lhs.add("3");
lhs.add("6");
lhs.add("1");
lhs.add("3");

Iterator<String> it = lhs.iterator();

while(it.hasNext()){
	System.out.println(it.next());
}

//결과
3
6
1

 

★ Custom Class에서의 중복 제거 및 Set 사용 ★

 

Wrapper class가 아닌 별도로 만든 class를 Set의 제너릭 타입으로 사용하는 경우 요소 중복 제거가 되지 않는다!

 

그 이유는 바로...

 

해당 클래스의 equals() 메소드 오버라이딩을 안해주어서 어떤 객체를 같은 객체로 판단할지를 모르기 때문이다.

 

다음과 같이 hashCode() 메소드와 equals() 메소드를 오버라이딩 해주자.

 

class Point {
	int i;
	int j;

	Point(int i, int j) {
		this.i = i;
		this.j = j;
	}
	
	 @Override            // HashSet을 중복을 제거하기 위해 사용 -> 근데 Wrapper class가 아닌 Custom class 상대로 중복 제거하려면 hashCode()와 equals(Object o)메소드를 오버라이딩 해주어야함!
	 public int hashCode()
	 {
	  return Integer.toString(i).hashCode()+Integer.toString(j).hashCode();
	 }
	 
	 @Override
	 public boolean equals(Object o)
	 {
		 Point p = (Point)o;
	  return (this.i == p.i && this.j == p.j);
	 }
}

 

추가 주의점

 

HashMap의 keySet을 오름차순 정렬할 때는 Set s = hm.keySet()을 ArrayList()로 바꾸어서 Collections.sort()로 정렬을 해주자!

(HashSet s = hm.keySet()이 되지 않는다,,, 왜지,,,)

반응형
Comments