Was ist der Unterschied zwischen dem Comparable Interface und einem Comparator?
was genau ist mit natürlicher Ordnung gemeint?Comparable ist ein Interface, dass eine Klasse implementieren kann und womit die Klasse dann die natürliche Ordnung ausdrücken kann.
Comparator ist etwas externes das etwas anderes vergleichen kann. Damit kann man beliebige Sortierungen darstellen.
Beispiel: Du verwaltest Mitarbeiter. Jetzt kann man sich überlegen, was hier als natürliche Ordnung angesehen wird. Das könnte z.B. die Sortierung nach Name sein.
Aber ggf. brauchst du auch andere Sortierungen:
- nach Gehalt
- nach Anzahl Überstunden
- nach Abteilungen
- nach Betriebszugehörigkeit
- ….
Einich möchte eine Liste von Zahlen nach ihrem kleinsten Primfaktor ornden. Kann ich das nur mit einem Comparator ?
Comparator<Integer>
würde sich hier definitiv anbieten, da du ja eine andere Ordnung als die "natürlich Ordnung" der Zahlen haben möchtest.Comparable<Integer>
anhand der natürlichen Ordnung der ganzen Zahlen, die du ja nicht haben möchtest. Außerdem kannst du natürlich die java.lang.Integer Klasse nicht anpassen.Comparator<Integer>
erzeugen:import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class SortBySmallestPrimeFactor {
// erstelle einen Comparator, der basierend auf smallestDivisor sortiert
public static final Comparator<Integer> bySmallestPrimeFactor =
Comparator.comparingInt(SortBySmallestPrimeFactor::smallestDivisor);
// ermittle den kleinsten Teiler von 'n'. Dieser ist auch immer eine Primzahl.
private static int smallestDivisor(Integer n) {
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
return i;
return n;
}
// Test
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(2, 4, 5, 6, 7, 8, 9, 11, 16, 200, 400);
// liest sich mit dem Comparator sehr gut "sort by smallest prime factor"
numbers.sort(bySmallestPrimeFactor);
System.out.println(numbers);
}
}