2013-11-22 18 views
8

Dòng return array[index1].compareTo(array[index2]); cung cấp lỗi "Không thể gọi compareTo (double) trên kiểu nguyên thủy đôi". Giải quyết vấn đề này như thế nào?Không thể gọi compareTo (double) trên kiểu nguyên thủy đôi

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

sử dụng Double class;) – Alessio

+0

Để khám phá thêm, hãy truy cập tài liệu java và trong đó đi tới gói java.lang.Double, đây được gọi là lớp Wrapper và trong Java cho mọi kiểu nguyên thủy có các lớp trình bao tương ứng. gói java.lang –

+0

Đây là liên kết cho tài liệu http://docs.oracle.com/javase/7/docs/api/ –

Trả lời

15

Thay thế tiếng gọi của một phương pháp dụ compareTo với tiếng gọi của static compare method, như thế này:

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

này cho phép bạn giữ double của bạn trong một loạt các nguyên thủy, và tránh autoboxing trước khi gọi một phương pháp dụ.

+0

+1 Tôi hoàn toàn quên 'Double.compare (...)';) – Thomas

+0

Cách thực hiện sắp xếp theo thứ tự ngược lại trong trường hợp này? Nơi để đặt, Collections.reverseOrder()? –

+0

@KlausosKlausos 'Collections.reverseOrder()' là để đảo ngược thứ tự tự nhiên. Vì bạn đang sử dụng một bộ so sánh, bạn có thể chuyển đổi thứ tự bên trong nó bằng cách gọi 'Double.so sánh (mảng [index2], mảng [index1]) ', hoặc bằng cách thêm cờ bổ sung' boolean isReverseOrder' vào hàm tạo, lưu trữ nó trong biến thành viên và đảo ngược kết quả so sánh bên trong phương thức 'so sánh' khi' isReverseOrder' được đặt. – dasblinkenlight

1

Trong các loại nguyên thủy java không có bất kỳ phương pháp nào. Thay vào đó, sử dụng các kiểu dữ liệu nguyên thủy sử dụng các lớp Wrapper.

thay đổi

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

để

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

hay

thử với Double[] array; thay vì double[] array;

1

với nhiều loại nguyên thủy không sử dụng compareTo, sử dụng == thay

nhưng nếu bạn muốn sử dụng compareTo chỉ cần tạo một mảng đúp

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

'==' không tương đương với 'compareTo' nhưng bằng' bằng'. – Thomas

0

loại nguyên thủy không thể so sánh trực tiếp bởi một so sánh, như giao diện chỉ được thực hiện bởi collator và RuleBasedCollator. Không có lớp bao bọc nào thực hiện so sánh. Do đó trình biên dịch sẽ không thể tự động hộp nó.

Chỉ cần nhìn vào lớp Đôi và bạn sẽ tìm thấy một phương pháp sẵn có cung cấp phương pháp so sánh.

public static int compare(double d1, double d2)

Returns: giá trị 0 nếu d1 là số lượng tương đương với d2; một giá trị nhỏ hơn 0 nếu d1 nhỏ hơn số d2; và giá trị lớn hơn 0 nếu d1 lớn hơn số d2.

Đảo ngược: Thêm toàn bộ biểu thức bằng -1;

Các vấn đề liên quan