2013-11-22 13 views
8

行は、"プリミティブ型doubleのcompareTo(double)を呼び出せません"というエラーを返します。この問題を解決するには?プリミティブ型doubleの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

この場合、逆の順序で並べ替えますか?どこに置くか、Collections.reverseOrder()? –

+0

@KlausosKlausos 'Collections.reverseOrder()'は自然順序を逆転させるためのものです。コンパレータを使用しているので、 'Double 'を呼び出すことで、コンパレータ内部の順序を切り替えることができます。コンストラクタに余分な 'boolean isReverseOrder'フラグを追加し、それをメンバ変数に格納し、' isReverseOrder'が実行されたときに 'compare'メソッドの内部で比較結果を反転することによって、配列を比較します(array [index2]、array [index1])'設定されています。 – dasblinkenlight

1

Javaプリミティブ型にはメソッドがありません。基本データ型を使用する代わりに、Wrapperクラスを使用します。

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

又は

変化

return 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クラスを見るだけで、比較メソッドを提供するinbuiltメソッドが見つかります。

public static int compare(double d1, double d2)

戻り値: 値0 D1がD2に数値的に等しい場合。 d1が数値的にd2未満の場合は0より小さい値、 d1が数値的にd2より大きい場合は0より大きい値です。

逆:式全体を-1倍にします。

関連する問題