일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 직무면접
- 리트코드
- 등촌동속눈썹펌
- 다시보기
- OS
- 코딩테스트
- 수학
- leetcode
- 마곡속눈썹연장
- 삼성 SW역량테스트 기출
- BOJ
- 마곡속눈썹펌
- 투포인터
- level2
- 알고리즘
- 삼성SW역량테스트
- 1차면접
- 삼성
- 추석트래픽
- Java
- 포스코
- 백준
- 시뮬레이션
- 딥러닝
- 정렬
- 운영체제
- 프로그래머스
- 카카오
- 등촌동속눈썹연장
- ai/bigdata
- Today
- Total
기록하는 습관을 들이자
Java Set (Set 인터페이스, HashSet, TreeSet, LinkedHashSet) 본문
이번에는 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()이 되지 않는다,,, 왜지,,,)
'알고리즘 > Java' 카테고리의 다른 글
[알고리즘] 투 포인터(Two-Pointer Algorithm) 알고리즘 (0) | 2020.05.06 |
---|---|
BigDecimal 클래스 - 오차 없는 부동 소수점 연산을 위한 클래스 (0) | 2020.04.15 |
Java HashMap 클래스와 메소드 (0) | 2020.04.06 |
알고리즘 구현 시 자주 등장하는 유형(개념) - JAVA (0) | 2020.04.05 |
Java 정렬(Sorting) (0) | 2020.04.05 |