行return array[index1].compareTo(array[index2]);
はエラーを提供します"プリミティブ型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);
次のように、インスタンスメソッドcompareTo
の呼び出しを static compare
method の呼び出しに置き換えます。
return Double.compare(array[index1], array[index2]);
これにより、double
sをプリミティブの配列に保持し、インスタンスメソッドを呼び出す前に自動ボックス化を回避できます。
In Javaプリミティブ型にはメソッドがありません。代わりに、プリミティブデータ型を使用する場合はラッパークラスを使用します。
変化する
return array[index1].compareTo(array[index2]);
に
return new Double(array[index1]).compareTo(array[index2]);
または
Double[] array;
の代わりにdouble[] array;
を試してください
プリミティブ型の場合はcompareTo
を使用せず、代わりに==
を使用してください
ただし、compareTo
を使用する場合は、Double配列を作成するだけです。
Double[] dist = new Double[centroids.size()];
インターフェイスはcollatorとRuleBasedCollatorによってのみ実装されるため、プリミティブ型をコンパレータで直接比較することはできません。コンパレータを実装するラッパークラスはありません。どのコンパイラがそれを自動ボックス化できないためです。
Doubleクラスを見るだけで、compareメソッドを提供する組み込みメソッドが見つかります。
public static int compare(double d1, double d2)
戻り値: d1がd2と数値的に等しい場合は値0。 d1が数値的にd2より小さい場合、0未満の値。 d1が数値的にd2より大きい場合は、0より大きい値。
Reverse:式全体に-1を掛けます。