logo

자바 트리셋 클래스

TreeSet 클래스 계층 구조

Java TreeSet 클래스는 저장을 위해 트리를 사용하는 Set 인터페이스를 구현합니다. AbstractSet 클래스를 상속하고 NavigableSet 인터페이스를 구현합니다. TreeSet 클래스의 객체는 오름차순으로 저장됩니다.

Java TreeSet 클래스에 대한 중요한 사항은 다음과 같습니다.

  • Java TreeSet 클래스에는 HashSet과 같은 고유한 요소만 포함되어 있습니다.
  • Java TreeSet 클래스 액세스 및 검색 시간은 매우 빠릅니다.
  • Java TreeSet 클래스는 null 요소를 허용하지 않습니다.
  • Java TreeSet 클래스가 동기화되지 않았습니다.
  • Java TreeSet 클래스는 오름차순을 유지합니다.
  • Java TreeSet 클래스에는 HashSet과 같은 고유한 요소만 포함되어 있습니다.
  • Java TreeSet 클래스 액세스 및 검색 시간은 매우 빠릅니다.
  • Java TreeSet 클래스는 null 요소를 허용하지 않습니다.
  • Java TreeSet 클래스가 동기화되지 않았습니다.
  • Java TreeSet 클래스는 오름차순을 유지합니다.
  • TreeSet은 비교할 수 있는 일반 유형만 허용할 수 있습니다. 예를 들어 Comparable 인터페이스는 StringBuffer 클래스에 의해 구현됩니다.

TreeSet 클래스의 내부 작업

TreeSet은 Red-Black Tree처럼 자체 균형을 이루는 이진 검색 트리를 사용하여 구현됩니다. 따라서 검색, 제거, 추가 등의 작업에는 O(log(N)) 시간이 소요됩니다. 그 이유는 자체 균형 트리에 있습니다. 언급된 모든 작업에 대해 트리 높이가 O(log(N))을 초과하지 않도록 보장하기 위한 것입니다. 따라서 정렬된 대용량 데이터를 보관하고 이에 대한 연산을 수행하기 위한 효율적인 데이터 구조 중 하나입니다.

TreeSet 클래스의 동기화

위에서 이미 언급했듯이 TreeSet 클래스는 동기화되지 않습니다. 이는 둘 이상의 스레드가 트리 집합에 동시에 액세스하고 액세스하는 스레드 중 하나가 이를 수정하는 경우 동기화를 수동으로 수행해야 함을 의미합니다. 일반적으로 세트를 캡슐화하는 일부 객체 동기화를 수행하여 수행됩니다. 그러나 그러한 객체가 발견되지 않는 경우 Collections.synchronizedSet() 메소드를 사용하여 세트를 래핑해야 합니다. 세트의 비동기화된 액세스를 피하기 위해 생성 시간 동안 이 방법을 사용하는 것이 좋습니다. 다음 코드 조각은 동일한 내용을 보여줍니다.

 TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet); 

TreeSet 클래스의 계층 구조

위 다이어그램에 표시된 것처럼 Java TreeSet 클래스는 NavigableSet 인터페이스를 구현합니다. NavigableSet 인터페이스는 SortedSet, Set, Collection 및 Iterable 인터페이스를 계층적 순서로 확장합니다.

TreeSet 클래스 선언

java.util.TreeSet 클래스 선언을 살펴보겠습니다.

 public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable 

Java TreeSet 클래스의 생성자

건설자 설명
트리세트() 이는 트리 세트의 자연 순서에 따라 오름차순으로 정렬되는 빈 트리 세트를 구성하는 데 사용됩니다.
TreeSet(컬렉션 c) 컬렉션의 요소를 포함하는 새 트리 세트를 만드는 데 사용됩니다. c.
TreeSet(비교기 비교기) 주어진 비교기에 따라 정렬될 빈 트리 세트를 구성하는 데 사용됩니다.
TreeSet(SortedSet s) 주어진 SortedSet의 요소를 포함하는 TreeSet을 만드는 데 사용됩니다.

Java TreeSet 클래스의 메소드

방법 설명
부울 추가(E e) 지정된 요소가 아직 존재하지 않는 경우 이 세트에 지정된 요소를 추가하는 데 사용됩니다.
부울 addAll(컬렉션 c) 지정된 컬렉션의 모든 요소를 ​​이 세트에 추가하는 데 사용됩니다.
E 천장(E e) 집합에서 지정된 요소와 같거나 가장 가까운 가장 큰 요소를 반환하거나, 그러한 요소가 없는 경우 null을 반환합니다.
비교기 비교기() 요소를 순서대로 정렬하는 비교기를 반환합니다.
반복자 내림차순Iterator() 요소를 내림차순으로 반복하는 데 사용됩니다.
NavigableSet 내림차순 세트() 요소를 역순으로 반환합니다.
E층(Ee) 집합에서 지정된 요소와 같거나 가장 가까운 최소 요소를 반환하거나 그러한 요소가 없는 경우 null을 반환합니다.
SortedSet headSet(E toElement) 지정된 요소보다 작은 요소 그룹을 반환합니다.
NavigableSet headSet(E toElement, 부울 포함) 지정된 요소보다 작거나 같은(포함이 true인 경우) 요소 그룹을 반환합니다.
E 더 높음(E e) 집합에서 지정된 요소 중 가장 가까운 요소를 반환하거나 그러한 요소가 없는 경우 null을 반환합니다.
반복자 iterator() 요소를 오름차순으로 반복하는 데 사용됩니다.
E하(E e) 집합에서 지정된 요소 중 가장 가까운 최소 요소를 반환하거나 그러한 요소가 없는 경우 null을 반환합니다.
E pollFirst() 가장 낮은(첫 번째) 요소를 검색하고 제거하는 데 사용됩니다.
E pollLast() 가장 높은(마지막) 요소를 검색하고 제거하는 데 사용됩니다.
분할기 분할기() 요소에 대해 후기 바인딩 및 빠른 실패 분할기를 만드는 데 사용됩니다.
NavigableSet subSet(E fromElement, 부울 fromInclusive, E toElement, 부울 toInclusive) 지정된 범위 사이에 있는 요소 집합을 반환합니다.
SortedSet 하위 집합(E fromElement, E toElement)) fromElement를 포함하고 toElement를 제외하는 지정된 범위 사이에 있는 요소 집합을 반환합니다.
SortedSet tailSet(E fromElement) 지정된 요소보다 크거나 같은 요소 집합을 반환합니다.
NavigableSet tailSet(E fromElement, 부울 포함) 지정된 요소보다 크거나 같은(포함이 true인 경우) 요소 집합을 반환합니다.
부울 포함(객체 o) 이 세트에 지정된 요소가 포함되어 있으면 true를 반환합니다.
부울 isEmpty() 이 세트에 요소가 없으면 true를 반환합니다.
부울 제거(객체 o) 존재하는 경우 이 세트에서 지정된 요소를 제거하는 데 사용됩니다.
무효 클리어() 이 세트에서 모든 요소를 ​​제거하는 데 사용됩니다.
객체 복제() 이 TreeSet 인스턴스의 얕은 복사본을 반환합니다.
전자 먼저() 현재 정렬된 세트에 있는 첫 번째(최하위) 요소를 반환합니다.
전자마지막() 현재 이 정렬된 집합에 있는 마지막(가장 높은) 요소를 반환합니다.
정수 크기() 이 세트의 요소 수를 반환합니다.

Java TreeSet 예

Java TreeSet 예 1:

Java TreeSet의 간단한 예를 살펴보겠습니다.

파일 이름: TreeSet1.java

 import java.util.*; class TreeSet1{ public static void main(String args[]){ //Creating and adding elements TreeSet al=new TreeSet(); al.add('Ravi'); al.add('Vijay'); al.add('Ravi'); al.add('Ajay'); //Traversing elements Iterator itr=al.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } } 
지금 테스트해보세요

산출:

Ajay Ravi Vijay 

Java TreeSet 예 2:

요소를 내림차순으로 순회하는 예를 살펴보겠습니다.

파일 이름: TreeSet2.java

 import java.util.*; class TreeSet2{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('Ravi'); set.add('Vijay'); set.add('Ajay'); System.out.println('Traversing element through Iterator in descending order'); Iterator i=set.descendingIterator(); while(i.hasNext()) { System.out.println(i.next()); } } } 
지금 테스트해보세요

산출:

Traversing element through Iterator in descending order Vijay Ravi Ajay Traversing element through NavigableSet in descending order Vijay Ravi Ajay 

Java TreeSet 예 3:

가장 높은 값과 가장 낮은 값을 검색하고 제거하는 예를 살펴보겠습니다.

파일 이름: TreeSet3.java

 import java.util.*; class TreeSet3{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add(24); set.add(66); set.add(12); set.add(15); System.out.println('Lowest Value: '+set.pollFirst()); System.out.println('Highest Value: '+set.pollLast()); } } 

산출:

 Lowest Value: 12 Highest Value: 66 

Java TreeSet 예 4:

이 예에서는 다양한 NavigableSet 작업을 수행합니다.

파일 이름: TreeSet4.java

 import java.util.*; class TreeSet4{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('A'); set.add('B'); set.add('C'); set.add('D'); set.add('E'); System.out.println('Initial Set: '+set); System.out.println('Reverse Set: '+set.descendingSet()); System.out.println('Head Set: '+set.headSet('C', true)); System.out.println('SubSet: '+set.subSet('A', false, 'E', true)); System.out.println('TailSet: '+set.tailSet('C', false)); } } 

산출:

Initial Set: [A, B, C, D, E] Reverse Set: [E, D, C, B, A] Head Set: [A, B, C] SubSet: [B, C, D, E] TailSet: [D, E] 

Java TreeSet 예 5:

이 예에서는 다양한 SortedSetSet 작업을 수행합니다.

파일 이름: TreeSet5.java

 import java.util.*; class TreeSet5{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('A'); set.add('B'); set.add('C'); set.add('D'); set.add('E'); System.out.println('Intial Set: '+set); System.out.println('Head Set: '+set.headSet('C')); System.out.println('SubSet: '+set.subSet('A', 'E')); System.out.println('TailSet: '+set.tailSet('C')); } } 

산출:

Intial Set: [A, B, C, D, E] Head Set: [A, B] SubSet: [A, B, C, D] TailSet: [C, D, E] 

Java TreeSet 예: 도서

세트에 책을 추가하고 모든 책을 인쇄하는 TreeSet 예제를 살펴보겠습니다. TreeSet의 요소는 Comparable 유형이어야 합니다. 문자열 및 래퍼 클래스는 기본적으로 비교 가능합니다. TreeSet에 사용자 정의 객체를 추가하려면 Comparable 인터페이스를 구현해야 합니다.

파일 이름: TreeSetExample.java

 import java.util.*; class Book implements Comparable{ int id; String name,author,publisher; int quantity; public Book(int id, String name, String author, String publisher, int quantity) { this.id = id; this.name = name; this.author = author; this.publisher = publisher; this.quantity = quantity; } // implementing the abstract method public int compareTo(Book b) { if(id&gt;b.id){ return 1; }else if(id <b.id){ return -1; }else{ 0; } public class treesetexample { static void main(string[] args) set treeset(); creating books book b1="new" book(121,'let us c','yashwant kanetkar','bpb',8); b2="new" book(233,'operating system','galvin','wiley',6); b3="new" book(101,'data communications & networking','forouzan','mc graw hill',4); adding to treeset set.add(b1); set.add(b2); set.add(b3); traversing for(book b:set){ system.out.println(b.id+' '+b.name+' '+b.author+' '+b.publisher+' '+b.quantity); < pre> <p> <strong>Output:</strong> </p> <pre>101 Data Communications &amp; Networking Forouzan Mc Graw Hill 4 121 Let us C Yashwant Kanetkar BPB 8 233 Operating System Galvin Wiley 6 </pre> <h3>ClassCast Exception in TreeSet</h3> <p>If we add an object of the class that is not implementing the Comparable interface, the ClassCast Exception is raised. Observe the following program.</p> <p> <strong>FileName:</strong> ClassCastExceptionTreeSet.java</p> <pre> // important import statement import java.util.*; class Employee { int empId; String name; // getting the name of the employee String getName() { return this.name; } // setting the name of the employee void setName(String name) { this.name = name; } // setting the employee id // of the employee void setId(int a) { this.empId = a; } // retrieving the employee id of // the employee int getId() { return this.empId; } } public class ClassCastExceptionTreeSet { // main method public static void main(String[] argvs) { // creating objects of the class Employee Employee obj1 = new Employee(); Employee obj2 = new Employee(); TreeSet ts = new TreeSet(); // adding the employee objects to // the TreeSet class ts.add(obj1); ts.add(obj2); System.out.println(&apos;The program has been executed successfully.&apos;); } } </pre> <p>When we compile the above program, we get the ClassCastException, as shown below.</p> <pre> Exception in thread &apos;main&apos; java.lang.ClassCastException: class Employee cannot be cast to class java.lang.Comparable (Employee is in unnamed module of loader &apos;app&apos;; java.lang.Comparable is in module java.base of loader &apos;bootstrap&apos;) at java.base/java.util.TreeMap.compare(TreeMap.java:1569) at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776) at java.base/java.util.TreeMap.put(TreeMap.java:785) at java.base/java.util.TreeMap.put(TreeMap.java:534) at java.base/java.util.TreeSet.add(TreeSet.java:255) at ClassCastExceptionTreeSet.main(ClassCastExceptionTreeSet.java:52) </pre> <p> <strong>Explanation:</strong> In the above program, it is required to implement a Comparable interface. It is because the TreeSet maintains the sorting order, and for doing the sorting the comparison of different objects that are being inserted in the TreeSet is must, which is accomplished by implementing the Comparable interface.</p> <hr></b.id){>

TreeSet의 ClassCast 예외

Comparable 인터페이스를 구현하지 않는 클래스의 객체를 추가하면 ClassCast 예외가 발생합니다. 다음 프로그램을 관찰하세요.

파일 이름: ClassCastExceptionTreeSet.java

 // important import statement import java.util.*; class Employee { int empId; String name; // getting the name of the employee String getName() { return this.name; } // setting the name of the employee void setName(String name) { this.name = name; } // setting the employee id // of the employee void setId(int a) { this.empId = a; } // retrieving the employee id of // the employee int getId() { return this.empId; } } public class ClassCastExceptionTreeSet { // main method public static void main(String[] argvs) { // creating objects of the class Employee Employee obj1 = new Employee(); Employee obj2 = new Employee(); TreeSet ts = new TreeSet(); // adding the employee objects to // the TreeSet class ts.add(obj1); ts.add(obj2); System.out.println(&apos;The program has been executed successfully.&apos;); } } 

위 프로그램을 컴파일하면 아래와 같이 ClassCastException이 발생합니다.

번호가 매겨진 알파벳
 Exception in thread &apos;main&apos; java.lang.ClassCastException: class Employee cannot be cast to class java.lang.Comparable (Employee is in unnamed module of loader &apos;app&apos;; java.lang.Comparable is in module java.base of loader &apos;bootstrap&apos;) at java.base/java.util.TreeMap.compare(TreeMap.java:1569) at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776) at java.base/java.util.TreeMap.put(TreeMap.java:785) at java.base/java.util.TreeMap.put(TreeMap.java:534) at java.base/java.util.TreeSet.add(TreeSet.java:255) at ClassCastExceptionTreeSet.main(ClassCastExceptionTreeSet.java:52) 

설명: 위 프로그램에서는 Comparable 인터페이스를 구현해야 합니다. 이는 TreeSet이 정렬 순서를 유지하기 때문이며, 정렬을 수행하려면 TreeSet에 삽입되는 여러 개체를 비교해야 하며 이는 Comparable 인터페이스를 구현하여 수행됩니다.