2013-11-22 137 views
8

」無法調用compareTo(double)return array[index1].compareTo(array[index2]);行提供了一個錯誤「」無法在基本類型雙「」上調用compareTo(double)。如何解決這個問題?對原始類型雙「

/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
/*:: 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

使用雙類;) – Alessio

+0

要了解更多信息,請訪問java文檔,並在其中轉到包java.lang.Double,這稱爲Wrapper類,並且在Java中對於每種基本類型都有對應的包裝類java.lang包 –

+0

以下是文檔鏈接http://docs.oracle.com/javase/7/docs/api/ –

回答

15

更換一個實例方法的電話與static compare method調用,就像這樣:

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

這可以讓你保持原語的數組你double秒,避免調用一個實例方法前,自動裝箱。

+0

+1我完全忘記了'Double.compare(...)';) – Thomas

+0

How在這種情況下按相反順序排序?放在哪裏,Collections.reverseOrder()? –

+0

@KlausosKlausos'Collections.reverseOrder()'用於反轉自然順序。由於您使用的是比較器,因此您可以通過調用「Double」來切換其內部的順序。比較(array [index2],array [index1])',或者通過向構造函數中添加額外的'boolean isReverseOrder'標誌,將其存儲在成員變量中,並在'isReverseOrder'時將比較結果反轉到'compare'方法內已設置。 – dasblinkenlight

1

在java原始類型中沒有任何方法。相反,使用原始數據類型使用Wrapper類。

變化

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

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

嘗試的Double[] array;代替double[] array;

1

基本類型不使用compareTo,使用==代替

,但如果你想使用compareTo只需要創建一個雙陣列

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

'=='不等於'compareTo',而是'equals'。 – Thomas

0

基本類型不能用比較直接比較,因爲接口僅由collat​​or和RuleBasedCollat​​or實現。沒有包裝類實現比較器。由於哪個編譯器將無法自動將其裝箱。

只需在Double類中查找,您會發現提供比較方法的內置方法。

public static int compare(double d1, double d2)

返回: 值0,如果D1在數值上等於D2;如果d1在數字上小於d2,則該值小於0;如果d1在數值上大於d2,則值大於0。

反向:將整個表達式乘以-1;