English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서, 예제를 통해 Java TreeSet 클래스와 그 다양한 작업 및 메서드를 배울 것입니다.
Java集合フレーム워크의 TreeSet 클래스는 트리 데이터 구조의 기능을 제공합니다.
그것은 확장했습니다NavigableSet 인터페이스。
TreeSet를 생성하기 위해 먼저 java.util.TreeSet 패키지를 가져오어야 합니다.
패키지를 가져온 후, Java에서 TreeSet를 생성하는 방법을 보여드리겠습니다.
TreeSet<Integer> numbers = new TreeSet<>();
여기서, 무参数의 TreeSet를 생성했습니다. 이 예제에서 TreeSet의 요소는 자연排序(오름차순)으로 정렬됩니다.
However, we can use the Comparator interface to customize the sorting of elements. We will learn about it in the later part of this tutorial.
The TreeSet class provides various methods that allow us to perform various operations on the collection.
add() - insert the specified element into the collection
addAll() - insert all elements of the specified collection into the collection
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> evenNumbers = new TreeSet<>(); // use the add() method evenNumbers.add(2); evenNumbers.add(4); evenNumbers.add(6); System.out.println("TreeSet: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); // use the addAll() method numbers.addAll(evenNumbers); System.out.println("새로운 TreeSet: " + numbers); } }
출력 결과
TreeSet: [2, 4, 6] 새로운 TreeSet: [1, 2, 4, 6]
To access the elements of the TreeSet, we can use the iterator() method. To use this method, we must import the java.util.Iterator package. For example,
import java.util.TreeSet; import java.util.Iterator; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("TreeSet: " + numbers); // call the iterator() method Iterator<Integer> iterate = numbers.iterator(); System.out.print("TreeSet uses an iterator: "); //access the element while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
출력 결과
TreeSet: [2, 5, 6] TreeSet uses an iterator: 2, 5, 6,
remove() - delete the specified element from the collection
removeAll() - delete all elements from the collection
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("TreeSet: " + numbers); // use the remove() method boolean value1 = numbers.remove(5); System.out.println("5Were they deleted? " + value1); // use the removeAll() method boolean value2 = numbers.removeAll(numbers); System.out.println("Did all elements get deleted? ") + value2); } }
출력 결과
TreeSet: [2, 5, 6] 5Were they deleted? true Did all elements get deleted? true
Since the TreeSet class implements NavigableSet, it provides various methods to navigate the elements of the tree set.
first() - return the first element of the collection
last() - return the last element of the collection
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("TreeSet: " + numbers); // use the first() method int first = numbers.first(); System.out.println("첫 번째 숫자: " + first); // last() 메서드를 사용합니다: int last = numbers.last(); System.out.println("마지막 숫자: " + last); } }
출력 결과
TreeSet: [2, 5, 6] 첫 번째 숫자: 2 마지막 숫자: 6
Higher(element) - 지정된 요소(element)보다 큰 요소 중 가장 작은 요소를 반환합니다.
lower(element) - 지정된 요소(element)보다 작은 요소 중 가장 큰 요소를 반환합니다.
ceiling(element) - 지정된 요소(element)보다 큰 요소 중 가장 작은 요소를 반환합니다. 전달된 요소(element)가 트리 집합에 존재하면, 전달된 요소(element)를 반환합니다.
floor(element) - 지정된 요소(element)보다 작은 요소 중 가장 큰 요소를 반환합니다. 전달된 요소(element)가 트리 집합에 존재하면, 전달된 요소(element)를 반환합니다.
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // higher()를 사용합니다: System.out.println("higher:을 사용합니다: " + numbers.higher(4); // lower()를 사용합니다: System.out.println("lower:을 사용합니다: " + numbers.lower(4); // ceiling()를 사용합니다: System.out.println("ceiling:을 사용합니다: " + numbers.ceiling(4); // floor()를 사용합니다: System.out.println("floor:을 사용합니다: " + numbers.floor(3); } }
출력 결과
TreeSet: [2, 4, 5, 6] higher:을 사용합니다: 5 lower:을 사용합니다: 2 ceiling:을 사용합니다: 4 floor:을 사용합니다: 2
pollFirst() - 첫 번째 요소를 반환하고 집합에서 제거합니다
pollLast() - 마지막 요소를 반환하고 집합에서 제거합니다
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // pollFirst()를 사용합니다: System.out.println("첫 번째 요소를 제거합니다: " + numbers.pollFirst()); // pollLast()를 사용합니다: System.out.println("마지막 요소를 제거합니다: " + numbers.pollLast()); System.out.println("새로운 TreeSet: " + numbers); } }
출력 결과
TreeSet: [2, 4, 5, 6] 첫 번째 요소를 제거합니다: 2 마지막 요소를 제거합니다: 6 새로운 TreeSet: [4, 5]
headSet() 메서드는 지정된 요소(element)를 포함한 모든 요소들(매개변수로 전달된 요소) 이전의 트리셋의 모든 요소들을 반환합니다.
booleanValue 매개변수는 선택 사항입니다. 기본 값은 false입니다.
booleanValue의 값이 true이면, 이 메서드는 지정된 요소 이전의 모든 요소들을 포함한 모든 요소들을 반환합니다.
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // headSet()사용 default 부울 값을 가지고 있습니다 System.out.println("부울 값을 포함하지 않는 headSet을 사용: ") + numbers.headSet(5); // headSet()사용 specified 부울 값을 가지고 있습니다 System.out.println("headSet과 부울 값을 함께 사용: ") + numbers.headSet(5, true)); } }
출력 결과
TreeSet: [2, 4, 5, 6] 부울 값을 포함하지 않는 headSet을 사용: [2, 4] headSet과 부울 값을 함께 사용: [2, 4, 5]
tailSet() 메서드는 지정된 요소(element)를 포함한 모든 요소들(매개변수로 전달된 요소) 이후의 트리셋의 모든 요소들을 반환합니다.
booleanValue 매개변수는 선택 사항입니다. 기본 값은 true입니다.
booleanValue를 false로 전달하면, 이 메서드는 지정된 모든 요소들, element를 포함하지 않고 element를 제외한 모든 요소들을 반환합니다.
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // tailSet()사용 default 부울 값을 가지고 있습니다 System.out.println("tailSet()사용 default 부울 값을 가지고 있습니다: ") + numbers.tailSet(4); // tailSet()사용 specified 부울 값을 가지고 있습니다 System.out.println("tailSet()가 부울 값을 가지고 있습니다: ") + numbers.tailSet(4, false)); } }
출력 결과
TreeSet: [2, 4, 5, 6] tailSet()사용 default 부울 값을 가지고 있습니다: [4, 5, 6] tailSet()가 부울 값을 가지고 있습니다: [5, 6]
subSet() 메서드는 e1e와2e를 포함한 모든 요소들,1。
bv1과 bv2은 선택 사항입니다. bv1의 기본 값은 true이며, bv2의 기본 값은 false입니다.
false를 bv로1전달된 e1e와2e를 포함하지 않는 모든 요소들,1。
true를 bv로2전달된 e1e와2e를 포함한 모든 요소들,1。
예를 들어
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // subSet() with default boolean value 사용 System.out.println("subSet()사용默认布尔값: ") + numbers.subSet(4, 6); // subSet()를 사용하여 지정된 부울 값을 System.out.println("subSet()는 지정된 부울 값을 사용하여 ", + numbers.subSet(4, false, 6, true)); } }
출력 결과
TreeSet: [2, 4, 5, 6] subSet()는 기본 부울 값을 사용하여 [4, 5] subSet()는 지정된 부울 값을 사용하여 [5, 6]
TreeSet 클래스의 메서드는 다양한 집합 연산을 수행할 수 있습니다.
두 집합 간의 합집합을 수행하려면 addAll() 메서드를 사용합니다. 예를 들어,
import java.util.TreeSet;; class Main { public static void main(String[] args) { TreeSet<Integer> evenNumbers = new TreeSet<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("트리셋",1: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("트리셋",2: " + numbers); //두 집합의 합집합 numbers.addAll(evenNumbers); System.out.println("합집합은: ", + numbers); } }
출력 결과
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] 합집합: [1, 2, 3, 4]
두 집합 간의 교집합을 수행하려면 retainAll() 메서드를 사용합니다. 예를 들어,
import java.util.TreeSet;; class Main { public static void main(String[] args) { TreeSet<Integer> evenNumbers = new TreeSet<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("트리셋",1: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("트리셋",2: " + numbers); // 두 집합의 교집합 numbers.retainAll(evenNumbers); System.out.println("집합의 교집합: ", + numbers); } }
출력 결과
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] 집합의 교집합: [2]
두 집합 간의 차집합을 계산하려면 removeAll() 메서드를 사용할 수 있습니다. 예를 들어,
import java.util.TreeSet;; class Main { public static void main(String[] args) { TreeSet<Integer> evenNumbers = new TreeSet<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("트리셋",1: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); System.out.println("트리셋",2: " + numbers); //집합의 차집합 numbers.removeAll(evenNumbers); System.out.println("차집합: ", + numbers); } }
출력 결과
TreeSet1: [2, 4] TreeSet2: [1, 2, 3, 4] 차집합: [1, 3]
어떤 집합이 다른 집합의 부집합인지 확인하려면 containsAll() 메서드를 사용합니다. 예를 들어,
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); System.out.println("트리셋",1: " + numbers); TreeSet<Integer> primeNumbers = new TreeSet<>(); primeNumbers.add(2); primeNumbers.add(3); System.out.println("트리셋",2: " + primeNumbers); //primeNumbers是否为numbers의 부집합인지 확인합니다 boolean result = numbers.containsAll(primeNumbers); System.out.println("트리셋",2TreeSet입니다1의 부모집합은 " + result); } }
출력 결과
TreeSet1: [1, 2, 3, 4] TreeSet2: [2, 3] TreeSet2TreeSet입니다1의 부모집합은 True입니다
메서드 | 설명 |
---|---|
clone() | TreeSet의 복사본을 생성합니다 |
contains() | TreeSet에서 지정된 요소를 검색하고布尔 결과를 반환합니다 |
isEmpty() | TreeSet이 비어 있는지 확인합니다 |
size() | TreeSet의 크기를 반환합니다 |
clear() | TreeSet에서 모든 요소를 제거합니다 |
TreeSet과 HashSet은 Set 인터페이스를 구현했습니다. 그러나 그들 간에는 차이가 있습니다.
HashSet과 달리 TreeSet의 요소는 특정 순서로 저장됩니다. 이는 TreeSet이 SortedSet 인터페이스를 구현했기 때문입니다.
TreeSet은 여러 쉽게 탐색할 수 있는 메서드를 제공합니다. 예를 들어 first(), last(), headSet(), tailSet() 등. 이는 TreeSet이 NavigableSet 인터페이스를 구현했기 때문입니다.
추가, 제거, 포함 및 크기와 같은 기본 작업에서 HashSet은 TreeSet보다 빠르습니다.
위의 모든 예제에서 트리 셋 요소는 자연 정렬로 되어 있습니다. 그러나 요소의 순서를 사용자 정의할 수도 있습니다.
따라서 우리는 자신의 comparator 클래스를 생성해야 합니다. 예를 들어, 트리 셋의 요소를 정렬하는 기반으로.
import java.util.TreeSet; import java.util.Comparator; class Main { public static void main(String[] args) { //사용자 정의 비교기로 TreeSet 생성 TreeSet<String> animals = new TreeSet<>(new CustomComparator()); animals.add("Dog"); animals.add("Zebra"); animals.add("Cat"); animals.add("Horse"); System.out.println("TreeSet: " + animals); } //일반적인 비교기 클래스를 생성합니다 public static class CustomComparator implements Comparator<String> { @Override public int compare(String animal1, String animal2) { int value = animal1.compareTo(animal2); //요소는 반대 순서로 정렬됩니다 if (value > 0) { return -1; } else if (value < 0) { return 1; } else { return 0; } } } }
출력 결과
TreeSet: [Zebra, Horse, Dog, Cat]
위의 예제에서, CustomComparator 클래스를 매개변수로 전달하여 트리 세트를 생성했습니다.
CustomComparator 클래스는 Comparator 인터페이스를 구현합니다.
그런 다음, compare() 메서드를 재정의합니다. 이제 이 메서드는 요소를 반대 순서로 정렬합니다.