Menguasai Java TreeSet: Operasi, Metode, dan Contoh Praktis
Java TreeSet
Dalam tutorial ini, kita akan mempelajari kelas Java TreeSet dan berbagai operasi serta metodenya dengan bantuan contoh.
Kelas TreeSet dari Java collections framework menyediakan fungsionalitas struktur data pohon.
Ia memperluas antarmuka NavigableSet.

Membuat TreeSet
Untuk membuat tree set, kita harus terlebih dahulu mengimpor paket java.util.TreeSet.
Setelah mengimpor paket, berikut cara membuat TreeSet di Java.
TreeSet<Integer> numbers = new TreeSet<>();
Di sini, kita telah membuat TreeSet tanpa argumen. Dalam hal ini, elemen-elemen dalam TreeSet diurutkan secara alami (urutan menaik).
Namun, kita dapat menyesuaikan pengurutan elemen dengan menggunakan antarmuka Comparator. Kita akan mempelajarinya lebih lanjut dalam tutorial ini.
Metode TreeSet
Kelas TreeSet menyediakan berbagai metode yang memungkinkan kita melakukan berbagai operasi pada himpunan.
Memasukkan Elemen ke TreeSet
add() - memasukkan elemen yang ditentukan ke himpunan addAll() - memasukkan semua elemen dari koleksi yang ditentukan ke himpunan
Contohnya,
import java.util.TreeSet; class Main { public static void main(String[] args) { TreeSet<Integer> evenNumbers = new TreeSet<>(); // Menggunakan metode add() evenNumbers.add(2); evenNumbers.add(4); evenNumbers.add(6); System.out.println("TreeSet: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); // Menggunakan metode addAll() numbers.addAll(evenNumbers); System.out.println("New TreeSet: " + numbers); } }
Output
TreeSet: [2, 4, 6] New TreeSet: [1, 2, 4, 6]
Mengakses Elemen TreeSet
Untuk mengakses elemen dari tree set, kita dapat menggunakan metode iterator(). Untuk menggunakan metode ini, kita harus mengimpor paket java.util.Iterator. Contohnya,
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); // Memanggil metode iterator() Iterator<Integer> iterate = numbers.iterator(); System.out.print("TreeSet using Iterator: "); // Mengakses elemen while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Output
TreeSet: [2, 5, 6] TreeSet using Iterator: 2, 5, 6,
Menghapus Elemen
remove() - menghapus elemen yang ditentukan dari himpunan removeAll() - menghapus semua elemen dari himpunan
Contohnya,
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); // Menggunakan metode remove() boolean value1 = numbers.remove(5); System.out.println("Is 5 removed? " + value1); // Menggunakan metode removeAll() boolean value2 = numbers.removeAll(numbers); System.out.println("Are all elements removed? " + value2); } }
Output
TreeSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true
Metode untuk Navigasi
Karena kelas TreeSet mengimplementasikan NavigableSet, ia menyediakan berbagai metode untuk menavigasi elemen-elemen tree set.
1. Metode first() dan last()
first() - mengembalikan elemen pertama dari himpunan last() - mengembalikan elemen terakhir dari himpunan
Contohnya,
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); // Menggunakan metode first() int first = numbers.first(); System.out.println("First Number: " + first); // Menggunakan metode last() int last = numbers.last(); System.out.println("Last Number: " + last); } }
Output
TreeSet: [2, 5, 6] First Number: 2 Last Number: 6
2. Metode ceiling(), floor(), higher() dan lower()
- higher(element) - Mengembalikan elemen terendah di antara elemen-elemen yang lebih besar dari
element yang ditentukan. - lower(element) - Mengembalikan elemen terbesar di antara elemen-elemen yang lebih kecil dari
element yang ditentukan. - ceiling(element) - Mengembalikan elemen terendah di antara elemen-elemen yang lebih besar dari element yang ditentukan. Jika element yang diteruskan ada dalam tree set, ia mengembalikan
element yang diteruskan sebagai argumen. - floor(element) - Mengembalikan elemen terbesar di antara elemen-elemen yang lebih kecil dari
element yang ditentukan. Jika element yang diteruskan ada dalam tree set, ia mengembalikan element yang diteruskan sebagai argumen.
Contohnya,
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); // Menggunakan higher() System.out.println("Using higher: " + numbers.higher(4)); // Menggunakan lower() System.out.println("Using lower: " + numbers.lower(4)); // Menggunakan ceiling() System.out.println("Using ceiling: " + numbers.ceiling(4)); // Menggunakan floor() System.out.println("Using floor: " + numbers.floor(3)); } }
Output
TreeSet: [2, 4, 5, 6] Using higher: 5 Using lower: 2 Using ceiling: 4 Using floor: 2
3. Metode pollfirst() dan pollLast()
pollFirst() - mengembalikan dan menghapus elemen pertama dari himpunan pollLast() - mengembalikan dan menghapus elemen terakhir dari himpunan
Contohnya,
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); // Menggunakan pollFirst() System.out.println("Removed First Element: " + numbers.pollFirst()); // Menggunakan pollLast() System.out.println("Removed Last Element: " + numbers.pollLast()); System.out.println("New TreeSet: " + numbers); } }
Output
TreeSet: [2, 4, 5, 6] Removed First Element: 2 Removed Last Element: 6 New TreeSet: [4, 5]
4. Metode headSet(), tailSet() dan subSet()
headSet(element, booleanValue)
Metode headSet() mengembalikan semua elemen dari tree set sebelum elemen element yang ditentukan (yang diteruskan sebagai argumen).
Parameter booleanValue adalah opsional. Nilai defaultnya adalah false.
Jika true diteruskan sebagai booleanValue, metode mengembalikan semua elemen sebelum elemen yang ditentukan termasuk elemen yang ditentukan.
Contohnya,
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); // Menggunakan headSet() dengan nilai boolean default System.out.println("Using headSet without boolean value: " + numbers.headSet(5)); // Menggunakan headSet() dengan nilai boolean yang ditentukan System.out.println("Using headSet with boolean value: " + numbers.headSet(5, true)); } }
Output
TreeSet: [2, 4, 5, 6] Using headSet without boolean value: [2, 4] Using headSet with boolean value: [2, 4, 5]
tailSet(element, booleanValue)
Metode tailSet() mengembalikan semua elemen dari tree set setelah elemen element yang ditentukan (yang diteruskan sebagai parameter) termasuk elemen element yang ditentukan.
Parameter booleanValue adalah opsional. Nilai defaultnya adalah true.
Jika false diteruskan sebagai booleanValue, metode mengembalikan semua elemen setelah elemen element yang ditentukan tanpa menyertakan elemen element yang ditentukan.
Contohnya,
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); // Menggunakan tailSet() dengan nilai boolean default System.out.println("Using tailSet without boolean value: " + numbers.tailSet(4)); // Menggunakan tailSet() dengan nilai boolean yang ditentukan System.out.println("Using tailSet with boolean value: " + numbers.tailSet(4, false)); } }
Output
TreeSet: [2, 4, 5, 6] Using tailSet without boolean value: [4, 5, 6] Using tailSet with boolean value: [5, 6]
subSet(e1, bv1, e2, bv2)
Metode subSet() mengembalikan semua elemen antara e1 dan e2 termasuk e1.
bv1 dan bv2 adalah parameter opsional. Nilai default bv1 adalah true, dan nilai default bv2 adalah false.
Jika false diteruskan sebagai bv1, metode mengembalikan semua elemen antara e1 dan e2 tanpa menyertakan e1.
Jika true diteruskan sebagai bv2, metode mengembalikan semua elemen antara e1 dan e2, termasuk e1.
Contohnya,
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); // Menggunakan subSet() dengan nilai boolean default System.out.println("Using subSet without boolean value: " + numbers.subSet(4, 6)); // Menggunakan subSet() dengan nilai boolean yang ditentukan System.out.println("Using subSet with boolean value: " + numbers.subSet(4, false, 6, true)); } }
Output
TreeSet: [2, 4, 5, 6] Using subSet without boolean value: [4, 5] Using subSet with boolean value: [5, 6]
Operasi Himpunan
Metode dari kelas TreeSet juga dapat digunakan untuk melakukan berbagai operasi himpunan.
Gabungan Himpunan
Untuk melakukan gabungan antara dua himpunan, kita menggunakan metode addAll(). Contohnya,
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("TreeSet1: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("TreeSet2: " + numbers); // Gabungan dua himpunan numbers.addAll(evenNumbers); System.out.println("Union is: " + numbers); } }
Output
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Union is: [1, 2, 3, 4]
Irisan Himpunan
Untuk melakukan irisan antara dua himpunan, kita menggunakan metode retainAll(). Contohnya,
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("TreeSet1: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("TreeSet2: " + numbers); // Irisan dua himpunan numbers.retainAll(evenNumbers); System.out.println("Intersection is: " + numbers); } }
Output
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Intersection is: [2]
Selisih Himpunan
Untuk menghitung selisih antara dua himpunan, kita dapat menggunakan metode removeAll(). Contohnya,
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("TreeSet1: " + evenNumbers); TreeSet<Integer> numbers = new TreeSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); System.out.println("TreeSet2: " + numbers); // Selisih antara dua himpunan numbers.removeAll(evenNumbers); System.out.println("Difference is: " + numbers); } }
Output
TreeSet1: [2, 4] TreeSet2: [1, 2, 3, 4] Difference is: [1, 3]
Subset dari Himpunan
Untuk memeriksa apakah suatu himpunan adalah subset dari himpunan lain atau tidak, kita menggunakan metode containsAll(). Contohnya,
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("TreeSet1: " + numbers); TreeSet<Integer> primeNumbers = new TreeSet<>(); primeNumbers.add(2); primeNumbers.add(3); System.out.println("TreeSet2: " + primeNumbers); // Periksa apakah primeNumbers adalah subset dari numbers boolean result = numbers.containsAll(primeNumbers); System.out.println("Is TreeSet2 subset of TreeSet1? " + result); } }
Output
TreeSet1: [1, 2, 3, 4] TreeSet2: [2, 3] Is TreeSet2 subset of TreeSet1? True
Metode Lainnya dari TreeSet
| Method | Description |
|---|
clone() | Membuat salinan TreeSet |
contains() | Mencari TreeSet untuk elemen yang ditentukan dan mengembalikan hasil boolean |
isEmpty() | Memeriksa apakah TreeSet kosong |
size() | Mengembalikan ukuran TreeSet |
clear() | Menghapus semua elemen dari TreeSet |
Untuk mempelajari lebih lanjut, kunjungi Java TreeSet (dokumentasi resmi Java).
TreeSet Vs. HashSet
Kedua TreeSet dan HashSet mengimplementasikan antarmuka Set. Namun, terdapat beberapa perbedaan di antara keduanya.
- Berbeda dengan
HashSet, elemen dalam TreeSet disimpan dalam urutan tertentu. Hal ini karena TreeSet juga mengimplementasikan antarmuka SortedSet. TreeSet menyediakan beberapa metode untuk navigasi yang mudah. Contohnya, first(), last(), headSet(), tailSet(), dll. Hal ini karena TreeSet juga mengimplementasikan antarmuka NavigableSet. HashSet lebih cepat dari TreeSet untuk operasi dasar seperti add, remove, contains dan size.
TreeSet Comparator
Dalam semua contoh di atas, elemen tree set diurutkan secara alami. Namun, kita juga dapat menyesuaikan urutan elemen.
Untuk ini, kita perlu membuat kelas komparator kustom berdasarkan elemen-elemen dalam tree set diurutkan. Contohnya,
import java.util.TreeSet; import java.util.Comparator; class Main { public static void main(String[] args) { // Membuat tree set dengan komparator kustom TreeSet<String> animals = new TreeSet<>(new CustomComparator()); animals.add("Dog"); animals.add("Zebra"); animals.add("Cat"); animals.add("Horse"); System.out.println("TreeSet: " + animals); } // Membuat kelas komparator public static class CustomComparator implements Comparator<String> { @Override public int compare(String animal1, String animal2) { int value = animal1.compareTo(animal2); // elemen diurutkan dalam urutan terbalik if (value > 0) { return -1; } else if (value < 0) { return 1; } else { return 0; } } } }
Output
TreeSet: [Zebra, Horse, Dog, Cat]
Dalam contoh di atas, kita telah membuat tree set dengan meneruskan kelas CustomComparator sebagai argumen.
Kelas CustomComparator mengimplementasikan antarmuka Comparator.
Kita kemudian mengganti metode compare(). Metode sekarang akan mengurutkan elemen dalam urutan terbalik.
Untuk mempelajari lebih lanjut, kunjungi Java Comparator (dokumentasi resmi Java).