2017-06-28 5 views
2

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:

Selection Sort

StdIn API

Dank im Voraus !!

  • StdIn.readAllInts() gibt Ihnen ein int[]
  • Selection.sort() und Selection.show() bevorzugen Integer[]

Kurz von StdIn.readAllInts Vorschlag des pro Mike Umschreiben:

+0

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

Antwort

2

Sie haben eine klassische "Impedanz mismatch" Situation hier bekam Es gibt keine magische Lösung. Sie müssen das int[] nehmen, das Sie von StdIn.readAllInts() erhalten, ein Integer[] der gleichen Länge schaffen, und die Zahlen vom int[] zum Integer[] eins-by-one kopieren, das eine Schleife verwendet.

+0

vielen Dank Bruder! Es funktionierte!! :) Ich hatte meinen Fehler herausgefunden, aber es war immer noch nicht klar. Wie jedoch durch Ihre Antwort erklärt wurde, wurden viele Dinge plötzlich klar. Und genau wie Sie mir geraten hatten, musste ich nur den Int [] nach Integer [] kopieren und voila! Sortierung funktioniert! – doctorwho

2
Integer[] a = StdIn.readAllInts(); 
Selection.sort(a); 

int[] cannot be converted to Integer[] wirft, weil die Methode readAllInts()int[] liefert wie sein Name schon sagt, und Arrays von verschiedenen Basistypen können nicht ineinander umgewandelt werden.

int[] a = StdIn.readAllInts(); 
Selection.sort(a); 

wirft eine weitere Ausnahme, als sort() Methode eine Reihe von Comparable s erwartet (das ein Array von Objekten ist) und bekommt eine Reihe von int s ...

Als int keine Class ist, Es implementiert keine Schnittstelle Comparable. Sie können auch eine Version von sort() schreiben, die ein Array von int s enthält. (Auch einige andere primitive Arten, wenn Sie brauchen ...)

Werfen Sie auch einen Blick auf the methods of class Arrays: die meisten von ihnen haben primitive Versionen neben den Generika oder Object diejenigen.

+0

vielen dank für die verwirrung. Und ein großes Dankeschön für die Verbindung. Hat mir viel geholfen! :) – doctorwho

Verwandte Themen