Java Collection-algoritmes: Sorteren, shuffelen en meer
Java Collection-algoritmes
In deze tutorial verkennen we de krachtige algoritmen die Java's Collections Framework biedt, met duidelijke, praktische voorbeelden.
Het Java Collections Framework levert een rijke set statische methoden – vaak generieke algoritmen genoemd – waarmee je datastructuren kunt manipuleren zonder boilerplate-code. Deze hulpmiddelen werken met elke collectie die de Collection-interface implementeert, en bieden zowel eenvoud als prestaties.
1. Sorteren met Collections.sort()
De sort()-methode ordent elementen in natuurlijke (oplopende) volgorde. Voor aangepaste ordening lever je een Comparator-implementatie.
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> getallen = new ArrayList<>();
getallen.add(4);
getallen.add(2);
getallen.add(3);
System.out.println("Onsorteerde ArrayList: " + getallen);
Collections.sort(getallen);
System.out.println("Gesorteerde ArrayList: " + getallen);
}
}
Output
Onsorteerde ArrayList: [4, 2, 3] Gesorteerde ArrayList: [2, 3, 4]
Voor aflopende volgorde of domeinspecifieke criteria, gebruik een aangepaste Comparator.
2. Willekeurige volgorde met Collections.shuffle()
Gebruik shuffle() om de volgorde van elementen te randomiseren, ideaal voor spellen of steekproeven.
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> getallen = new ArrayList<>();
getallen.add(1);
getallen.add(2);
getallen.add(3);
System.out.println("Gesorteerde ArrayList: " + getallen);
Collections.shuffle(getallen);
System.out.println("ArrayList na shuffelen: " + getallen);
}
}
Output
Gesorteerde ArrayList: [1, 2, 3] ArrayList na shuffelen: [2, 1, 3]
Elke run produceert een andere permutatie, dankzij het onderliggende Fisher-Yates-algoritme.
3. Routinematige datamanipulatie
Java biedt een reeks hulpmethoden om collecties te transformeren:
reverse()– keert de elementvolgorde omfill()– vervangt elk element door een gespecificeerde waardecopy()– kopieert elementen van ene collectie naar een andere (dezelfde grootte)swap()– wisselt twee elementen op indexaddAll()– voegt alle elementen van ene collectie toe aan een andere
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> getallen = new ArrayList<>();
getallen.add(1);
getallen.add(2);
System.out.println("ArrayList1: " + getallen);
Collections.reverse(getallen);
System.out.println("Omgekeerde ArrayList1: " + getallen);
Collections.swap(getallen, 0, 1);
System.out.println("ArrayList1 na swap(): " + getallen);
ArrayList<Integer> nieuweGetallen = new ArrayList<>();
nieuweGetallen.addAll(getallen);
System.out.println("ArrayList2 met addAll(): " + nieuweGetallen);
Collections.fill(getallen, 0);
System.out.println("ArrayList1 na fill(): " + getallen);
Collections.copy(nieuweGetallen, getallen);
System.out.println("ArrayList2 na copy(): " + nieuweGetallen);
}
}
Output
ArrayList1: [1, 2] Omgekeerde ArrayList1: [2, 1] ArrayList1 na swap(): [1, 2] ArrayList2 met addAll(): [1, 2] ArrayList1 na fill(): [0, 0] ArrayList2 na copy(): [0, 0]
Let op: De copy()-methode vereist dat de doelcollectie minstens evenveel elementen heeft als de bron.
4. Binaire zoeken met Collections.binarySearch()
Zoek efficiënt een element in een gesorteerde collectie. De methode retourneert de index of een negatieve invoegpositie als niet gevonden.
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> getallen = new ArrayList<>();
getallen.add(1);
getallen.add(2);
getallen.add(3);
int pos = Collections.binarySearch(getallen, 3);
System.out.println("De positie van 3 is " + pos);
}
}
Output
De positie van 3 is 2.
Tip: Sorteer de collectie altijd voordat je binarySearch() aanroept; anders is het resultaat ongedefinieerd.
5. Collectiesamenstelling
Deze hulpmiddelen analyseren relaties tussen collecties:
frequency()– telt voorkomens van een specifiek elementdisjoint()– controleert of twee collecties geen gemeenschappelijke elementen delen
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> getallen = new ArrayList<>();
getallen.add(1);
getallen.add(2);
getallen.add(3);
getallen.add(2);
System.out.println("ArrayList1: " + getallen);
int aantal = Collections.frequency(getallen, 2);
System.out.println("Aantal 2: " + aantal);
ArrayList<Integer> nieuweGetallen = new ArrayList<>();
nieuweGetallen.add(5);
nieuweGetallen.add(6);
System.out.println("ArrayList2: " + nieuweGetallen);
boolean disjoint = Collections.disjoint(getallen, nieuweGetallen);
System.out.println("Twee lijsten zijn disjunct: " + disjoint);
}
}
Output
ArrayList1: [1, 2, 3, 2] Aantal 2: 2 ArrayList2: [5, 6] Twee lijsten zijn disjunct: true
6. Minimum en maximum vinden
Haalt het kleinste of grootste element op met min() en max() – nuttig voor analyses en grenscontroles.
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> getallen = new ArrayList<>();
getallen.add(1);
getallen.add(2);
getallen.add(3);
int min = Collections.min(getallen);
System.out.println("Minimum element: " + min);
int max = Collections.max(getallen);
System.out.println("Maximum element: " + max);
}
}
Output
Minimum element: 1 Maximum element: 3
Java
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java-commentaar: typen, gebruik en best practices
- Java if…else beheersen: control flow uitgelegd
- Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
- Java Strings beheersen: aanmaken, methodes en best practices
- Java interfaces meesteren: concepten, implementatie en best practices
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
- Willekeurige Getallen Genereren in Java: Praktische Gids met Random en Math.random