Ich habe versucht, das Selection Sort-Programm in Java mit Komparatoren zu implementieren.So implementieren Sie die Auswahl Sortieren mit Komparatoren für Ganzzahlen?
Doch während das Programm richtig für Strings funktioniert, ist es für ganze Zahlen und gemischten Fall Zeichen fehlschlägt (habe nicht versucht, noch Gleitkommazahlen!)
Hier ist mein Code:
package edu.princeton.cs.algs4;
import java.util.Comparator;
public class Selection {
public static void sort(Comparable[] a) {
int n = a.length;
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i+1; j < n; j++) {
if (less(a[j], a[min])) min = j;
}
exch(a, i, min);
assert isSorted(a, 0, i);
}
assert isSorted(a);
}
public static void sort(Object[] a, Comparator comparator) {
int n = a.length;
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i+1; j < n; j++) {
if (less(comparator, a[j], a[min])) min = j;
}
exch(a, i, min);
assert isSorted(a, comparator, 0, i);
}
assert isSorted(a, comparator);
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static boolean less(Comparator comparator, Object v, Object w)
{
return comparator.compare(v, w) < 0;
}
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
private static boolean isSorted(Comparable[] a) {
return isSorted(a, 0, a.length - 1);
}
private static boolean isSorted(Comparable[] a, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(a[i], a[i-1])) return false;
return true;
}
private static boolean isSorted(Object[] a, Comparator comparator) {
return isSorted(a, comparator, 0, a.length - 1);
}
private static boolean isSorted(Object[] a, Comparator comparator, int
lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(comparator, a[i], a[i-1])) return false;
return true;
}
private static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
StdOut.println(a[i]);
}
}
public static void main(String[] args) {
String[] a = StdIn.readAllStrings();
Selection.sort(a);
show(a);
}
}
von Der Weg, "StdIn" ist die Klasse von der Princeton University für die Standard-Eingabe und readAllStrings liefert ein Array aller Strings aus Datei/Standard-Eingabe gelesen.
Der obige Code funktionierte perfekt für String-Daten. Wenn ich jedoch denselben Code für Integer-Daten testen wollte, ist die Kompilierung fehlgeschlagen.
Dies ist, wie ich den Code in der main() Teil geändert:
public static void main() {
Integer[] a = StdIn.readAllInts();
Selection.sort(a);
Selection.show(a);
}
readAllInts() ist ähnlich(), um readAllStrings. Es liest alle ganzen Zahlen und gibt ein Array von ganzen Zahlen zurück.
jedoch beim Übersetzen bekam ich folgende Fehlermeldung:
int [] kann nicht in Integer umgewandelt werden []
Deshalb ich den Code wieder wie folgt ersetzt:
public static void main(String[] args) {
int[] a = StdIn.readAllInts();
Selection.sort(a);
Selection.show(a);
}
Allerdings habe ich wieder Fehler:
Auswahl. Java: 80: Fehler: Methode show in class Auswahl kann nicht auf bestimmte Typen angewendet werden; Grund: Argumentkonflikt; int kann nicht umgewandelt werden Vergleichbar []
und dieser Fehler auf:
Selection.java:79: Fehler: kein geeignetes Verfahren zur Art gefunden (int [])
Könnte jemand bitte Sag mir, wie gehe ich dieses Problem um? Ich habe eine Methode gefunden, die funktioniert, aber dort muss ich zuerst das Integer-Array initialisieren und auch die Werte bereitstellen.
Was bedeutet, ich kann nicht aus der Datei lesen, im Gegensatz zu dem, was ich für String getan habe.
Hier sind die Links zu den jeweiligen APIs zur weiteren Verfügung:
Dank im Voraus !!
StdIn.readAllInts()
gibt Ihnen einint[]
Selection.sort()
undSelection.show()
bevorzugenInteger[]
Kurz von StdIn.readAllInts
Vorschlag des pro Mike Umschreiben:
Ich würde _strongly suggerate_ ** not ** auf die von der Princeton University bereitgestellten APIs verlassen, da sie keine Standard-APIs sind und zu allen oben genannten Fehlern (und mehr!) Führen, besonders wenn Sie neu in der Programmierung sind. Verstehen Sie ihren Code und implementieren Sie mithilfe von Standard-Java-Bibliotheken und wenn Sie sich sicher sind, beginnen Sie mit * ihren * APIs herumzuspielen. Für Programmieraufgaben müssen Sie nur die APIs der Princeton University verwenden. – doctorwho