Menguasai Algoritma Koleksi Java: Pengurutan, Pengacakan, dan Lainnya
Algoritma Java
Dalam tutorial ini, kita menjelajahi algoritma canggih yang disediakan oleh Java Collections framework melalui contoh-contoh praktis yang jelas.
Java Collections framework menyediakan serangkaian metode statis yang sering disebut algoritma generik yang memungkinkan Anda memanipulasi struktur data tanpa menulis kode boilerplate. Utilitas ini bekerja dengan koleksi apa pun yang mengimplementasikan antarmuka Collection, menawarkan kesederhanaan dan kinerja.
Di bawah, kita melalui algoritma yang paling sering digunakan, mengilustrasikan sintaks, perilaku, dan kasus penggunaan praktisnya.
1. Pengurutan dengan Collections.sort()
Metode sort() mengurutkan elemen dalam urutan alami (menaik). Untuk urutan kustom, berikan implementasi Comparator.
import java.util.ArrayList; import java.util.Collections; class Main { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(4); numbers.add(2); numbers.add(3); System.out.println("Unsorted ArrayList: " + numbers); Collections.sort(numbers); System.out.println("Sorted ArrayList: " + numbers); } }
Output
Unsorted ArrayList: [4, 2, 3] Sorted ArrayList: [2, 3, 4]
Untuk urutan menurun atau kriteria khusus domain, gunakan Comparator kustom—lihat panduan Java Sorting untuk detailnya.
2. Mengacak Urutan dengan Collections.shuffle()
Gunakan shuffle() untuk mengacak urutan elemen, ideal untuk skenario game atau sampling.
import java.util.ArrayList; import java.util.Collections; class Main { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("Sorted ArrayList: " + numbers); Collections.shuffle(numbers); System.out.println("ArrayList after shuffle: " + numbers); } }
Output
Sorted ArrayList: [1, 2, 3] ArrayList after shuffle: [2, 1, 3]
Setiap run menghasilkan permutasi yang berbeda, berkat algoritma Fisher-Yates di balik layar.
3. Manipulasi Data Rutin
Java menawarkan serangkaian metode utilitas untuk mentransformasi koleksi:
reverse() – membalik urutan elemen. fill() – mengganti setiap elemen dengan nilai yang ditentukan. copy() – menyalin elemen dari satu koleksi ke koleksi lain (ukuran sama). swap() – menukar dua elemen berdasarkan indeks. addAll() – menambahkan semua elemen dari satu koleksi ke koleksi lain.
import java.util.ArrayList; import java.util.Collections; class Main { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); System.out.println("ArrayList1: " + numbers); Collections.reverse(numbers); System.out.println("Reversed ArrayList1: " + numbers); Collections.swap(numbers, 0, 1); System.out.println("ArrayList1 after swap(): " + numbers); ArrayList<Integer> newNumbers = new ArrayList<>(); newNumbers.addAll(numbers); System.out.println("ArrayList2 using addAll(): " + newNumbers); Collections.fill(numbers, 0); System.out.println("ArrayList1 after fill(): " + numbers); Collections.copy(newNumbers, numbers); System.out.println("ArrayList2 after copy(): " + newNumbers); } }
Output
ArrayList1: [1, 2] Reversed ArrayList1: [2, 1] ArrayList1 after swap(): [1, 2] ArrayList2 using addAll(): [1, 2] ArrayList1 after fill(): [0, 0] ArrayList2 after copy(): [0, 0]
Catatan: Metode copy() mengharuskan koleksi tujuan memiliki setidaknya sebanyak elemen yang ada di koleksi sumber.
4. Pencarian Biner dengan Collections.binarySearch()
Menemukan elemen secara efisien dalam koleksi terurut. Metode mengembalikan indeks elemen atau titik penyisipan negatif jika tidak ditemukan.
import java.util.ArrayList; import java.util.Collections; class Main { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); int pos = Collections.binarySearch(numbers, 3); System.out.println("The position of 3 is " + pos); } }
Output
The position of 3 is 2.
Tips: Selalu urutkan koleksi sebelum memanggil binarySearch(); jika tidak, hasilnya tidak terdefinisi.
Jelajahi lebih dalam artikel Java Binary Search.
5. Komposisi Koleksi
Utilitas ini menganalisis hubungan antara koleksi:
frequency() – menghitung kemunculan elemen tertentu. disjoint() – memeriksa apakah dua koleksi tidak memiliki elemen umum.
import java.util.ArrayList; import java.util.Collections; class Main { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(2); System.out.println("ArrayList1: " + numbers); int count = Collections.frequency(numbers, 2); System.out.println("Count of 2: " + count); ArrayList<Integer> newNumbers = new ArrayList<>(); newNumbers.add(5); newNumbers.add(6); System.out.println("ArrayList2: " + newNumbers); boolean disjoint = Collections.disjoint(numbers, newNumbers); System.out.println("Two lists are disjoint: " + disjoint); } }
Output
ArrayList1: [1, 2, 3, 2] Count of 2: 2 ArrayList2: [5, 6] Two lists are disjoint: true
6. Mencari Nilai Minimum dan Maksimum
Mengambil elemen terkecil atau terbesar dengan min() dan max()—berguna untuk analisis dan pemeriksaan batas.
import java.util.ArrayList; import java.util.Collections; class Main { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); int min = Collections.min(numbers); System.out.println("Minimum Element: " + min); int max = Collections.max(numbers); System.out.println("Maximum Element: " + max); } }
Output
Minimum Element: 1 Maximum Element: 3