The line return array[index1].compareTo(array[index2]);
provides an error "Cannot invoke compareTo(double) on the primitive type double". How to solve this issue?
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:: 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);
Replace the call of an instance method
compareTo
with the call of staticcompare
method, like this:This lets you keep your
double
s in an array of primitives, and avoid autoboxing before calling an instance method.Primitive Types cannot be compared directly by a comparator, as the interface is only implemented by collator and RuleBasedCollator. No wrapper class implements comparator. Due to which compiler won't be able to auto box it.
Just look in Double class and you will find an inbuilt method which provides compare method.
public static int compare(double d1, double d2)
Returns: the value 0 if d1 is numerically equal to d2; a value less than 0 if d1 is numerically less than d2; and a value greater than 0 if d1 is numerically greater than d2.
Reverse: Multiple the entire expression by -1;
for primitive types do not use
compareTo
, use==
insteadbut if you want to use
compareTo
just create a Double arrayIn java primitive types don't have any methods. Instead using primitive data types use Wrapper classes.
change
to
or
try with
Double[] array;
instead ofdouble[] array;