2013-11-22 7 views
8

Die Zeile return array[index1].compareTo(array[index2]); enthält einen Fehler "Kann compareTo (double) auf dem primitiven Typ double" nicht aufrufen. Wie kann ich dieses Problem lösen?Kann compareTo (double) auf dem primitiven Typ double nicht aufrufen

/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
/*:: This function implements a comparator of double values  :*/ 
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
private class ArrayIndexComparator implements Comparator<Integer> 
{ 
    private final double[] array; 

    public ArrayIndexComparator(double[] array) 
    { 
     this.array = array; 
    } 

    public Integer[] createIndexArray() 
    { 
     Integer[] indexes = new Integer[array.length]; 
     for (int i = 0; i < array.length; i++) 
     { 
      indexes[i] = i; // Autoboxing 
     } 
     return indexes; 
    } 

    @Override 
    public int compare(Integer index1, Integer index2) 
    { 
     // Autounbox from Integer to int to use as array indexes 
     return array[index1].compareTo(array[index2]); 
    } 
} 


double[] dist = new double[centroids.size()]; 
// fill array...  
ArrayIndexComparator comparator = new ArrayIndexComparator(dist); 
Integer[] indexes = comparator.createIndexArray(); 
Arrays.sort(indexes, comparator); 
+2

Verwenden Sie Double-Klasse;) – Alessio

+0

Um mehr zu erkunden besuchen Sie die Java-Dokumentation und innerhalb dieser gehen Sie zum Paket java.lang.Double, das heißt eine Wrapper-Klasse und in Java für jeden primitiven Typ gibt es entsprechende Wrapper-Klassen sind unter vorhanden Das Paket java.lang –

+0

Hier ist der Link für die Dokumentation http://docs.oracle.com/javase/7/docs/api/ –

Antwort

15

Ersetzen Sie den Aufruf einer Instanzmethode compareTo mit dem Aufruf von static compare method, wie folgt aus:

return Double.compare(array[index1], array[index2]); 

Auf diese Weise können Sie halten Ihre double s in einer Reihe von Primitiven, und vermeiden Sie eine Instanz Methode Autoboxing vor dem Aufruf.

+0

+1 Ich habe total vergessen 'Double.compare (...)';) – Thomas

+0

How in diesem Fall in umgekehrter Reihenfolge sortieren? Wo zu setzen, Collections.reverseOrder()? –

+0

@KlausosKlausos 'Collections.reverseOrder()' dient zum Umkehren der natürlichen Reihenfolge. Da Sie einen Komparator verwenden, können Sie die Reihenfolge ändern, indem Sie 'Double 'aufrufen.compare (array [index2], array [index1]) 'oder durch Hinzufügen eines zusätzlichen' boolean isReverseOrder'-Flags zum Konstruktor, Speichern in einer Membervariablen und Invertieren des Vergleichsergebnisses innerhalb der 'compare' Methode, wenn' isReverseOrder' ist eingestellt. – dasblinkenlight

1

In Java haben primitive Typen keine Methoden. Verwenden Sie stattdessen primitive Datentypen Wrapper-Klassen.

Änderung

return array[index1].compareTo(array[index2]); 

zu

return new Double(array[index1]).compareTo(array[index2]); 

oder

versuchen mit Double[] array; statt double[] array;

1

für primitive Typen nicht compareTo verwenden, verwenden == statt

aber wenn Sie compareTo verwenden möchten erstellen Sie einfach eine Doppel Array

Double[] dist = new Double[centroids.size()]; 
+1

'==' ist kein Äquivalent von 'compareTo' sondern von' equals'. – Thomas

0

Primitivtypen können nicht direkt durch einen Komparator verglichen werden, da die Schnittstelle wird nur von Collator und RuleBasedCollator implementiert. Keine Wrapper-Klasse implementiert Komparator. Aufgrund dessen kann Compiler es nicht automatisch boxen.

Schauen Sie einfach in Double-Klasse und Sie finden eine eingebaute Methode, die Vergleichsmethode bietet.

public static int compare(double d1, double d2)

Returns: der Wert 0, wenn d1 zu d2 numerisch gleich ist; ein Wert kleiner als 0, wenn d1 numerisch kleiner als d2 ist; und ein Wert größer als 0, wenn d1 numerisch größer als d2 ist.

Reverse: Multiple der gesamte Ausdruck von -1;