[ Java ] TreeSet 기본 구조 이해 및 실습
환경 : Eclipse
[ TreeSet ]
TreeSet은 자바 프로그래밍 언어에서 제공하는 자료구조 중 하나로, Set 인터페이스를 구현한 클래스이다.
** 중복된 값을 허용하지 않고, 값을 정렬된 순서로 저장하는 컬렉션
→ HashSet과 달리 이진 탐색 트리 (BinarySearchTree) 구조로 이루어져 있다.
└ 추가와 삭제에는 시간이 걸리지만, 검색 및 정렬에 좋은 자료구조
└ 이진 탐색 트리 중 레드-블랙 트리(Red-Black Tree) 구조로 구현되어 있음
[ TreeSet 이해를 위한 추가 설명 ]
이해가 됐다면 굳이 읽을 필요 없음
TreeSet이 나무(Tree)라면, 나무의 잎(값)이 달려 있습니다. 각 잎은 나무의 크기 순서로 정렬되어 있다고 볼 수 있습니다.
여기서 중요한 개념은 '중복된 값이 허용되지 않는다'는 것입니다. (TreeSet에는 같은 값을 두 번 이상 저장할 수 없습니다.) 만약 이미 나무에 해당 잎이 달려 있다면, 같은 잎을 또 다시 추가할 수 없는 것입니다.
또 다른 중요한 특징은 '정렬된 순서로 값이 저장된다'는 것입니다. 이것은 나중에 값을 찾거나 정렬된 상태로 사용할 때 좋습니다.
[ TreeSet 사용예제 ]
- 시험 점수를 저장하는 TreeSet
- 중복된 값은 또 추가되지 않음
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
// TreeSet 생성
TreeSet<Integer> examScores = new TreeSet<>();
// 시험 점수 추가
examScores.add(85);
examScores.add(92);
examScores.add(78);
examScores.add(96);
// 중복된 값 추가 시도 (이미 78이 있으므로 추가되지 않음)
examScores.add(78);
// TreeSet 출력
System.out.println("시험 점수 목록: " + examScores);
}
}
(+) 점수 추가에 add() 메소드를 쓰는 것처럼 다른 일을 할 때에도 메소드를 사용한다.
예) remove(), clear(), size() 등
- 출력결과
시험 점수 목록: [78, 85, 92, 96]
(참고) 저장되는 구조 이해
(+) 예시 코드의 값과 그림의 값이 다르지만, 이해를 위해 해당 티스토리에서 가져왔습니다.
[ TreeSet 사용예제2 - 업캐스팅 ]
- 전체코드
import java.util.Set;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
// TreeSet 인스턴스 생성
Set<String> words = new TreeSet<>();
// 데이터 추가
words.add("Apple");
words.add("Banana");
words.add("Orange");
words.add("Grapes");
words.add("Banana"); // 중복된 데이터 추가 시도
// 데이터 검색
// - "Orange"가 저장소에 있습니까?
System.out.println("\"Orange\"가 저장소에 있습니까? " + words.contains("Orange"));
// 데이터 삭제
words.remove("Apple");
// 새로운 데이터 추가
words.add("Mango");
// 데이터 출력
System.out.println("저장소의 모든 데이터: " + words);
System.out.println("데이터 개수: " + words.size());
}
}
- TreeSet 인스턴스 생성
// TreeSet 인스턴스 생성
Set<String> words = new TreeSet<>(); //업캐스팅
(+) Set 인터페이스는 TreeSet 클래스를 구현하고 있기 때문에, TreeSet 객체를 Set 참조 변수에 할당할 수 있다.
- add(), 데이터 추가
// 데이터 추가
words.add("Apple");
words.add("Banana");
words.add("Orange");
words.add("Grapes");
words.add("Banana"); // 중복된 데이터 추가 시도
(+) 중복된 데이터를 추가하려 해도 추가되지 않음.
- contains(), 데이터 검색
// 데이터 검색
// - "Orange"가 저장소에 있습니까?
System.out.println("\"Orange\"가 저장소에 있습니까? " + words.contains("Orange"));
(+) words 트리셋 안에 "Orange" 문자열이 있는지 확인
(+) boolean 값 반환
- remove(), 데이터 삭제
// 데이터 삭제
words.remove("Apple");
- size(), 데이터 개수
System.out.println("데이터 개수: " + words.size());
개인 공부 기록용입니다:)