2013-11-22 7 views
8

लाइन return array[index1].compareTo(array[index2]); एक त्रुटि प्रदान करता है "तुलनात्मक प्रकार डबल ( पर तुलना करने के लिए (डबल) नहीं आ सकता है। इस मुद्दे को कैसे हल करें?तुलनात्मक रूप से टाइप नहीं कर सकते हैं (डबल) आदिम प्रकार पर डबल

/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
/*:: 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.lang पर जाएं। डबल, इसे प्रत्येक प्राचीन प्रकार के लिए रैपर क्लास और जावा में कहा जाता है, इसी प्रकार के रैपर वर्ग मौजूद होते हैं java.lang पैकेज –

+0

यहां दस्तावेज़ों के लिए लिंक है http://docs.oracle.com/javase/7/docs/api/ –

उत्तर

15

एक उदाहरण विधि +०१२३११४११२ की कॉल की जगह की कोशिश static compare method की कॉल, इस तरह के साथ:

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

यह आपको पुरातन की एक सरणी में अपने double रों रखने के लिए, और एक उदाहरण विधि कॉल करने से पहले autoboxing से बचने कर सकते हैं।

+0

+1 मैं पूरी तरह से 'Double.compare (...) 'भूल गया; – Thomas

+0

कैसे इस मामले में रिवर्स ऑर्डर क्रमबद्ध करने के लिए? कहां रखा जाए, Collections.reverseOrder()? –

+0

@ क्लोसॉसक्लाउस 'संग्रह। रिवर्सऑर्डर()' प्राकृतिक क्रम को उलटाने के लिए है। चूंकि आप एक तुलनित्र का उपयोग कर रहे हैं, इसलिए आप 'डबल' कॉल करके इसके अंदर ऑर्डर को स्विच कर सकते हैं।तुलना करें (सरणी [अनुक्रमणिका 2], सरणी [अनुक्रमणिका 1]) ', या कन्स्ट्रक्टर को अतिरिक्त' बूलियन isReverseOrder' ध्वज जोड़कर, इसे सदस्य चर में संग्रहीत करना, और 'तुलना' विधि के अंदर तुलना परिणाम को निष्क्रिय करना 'isReverseOrder' सेट है – dasblinkenlight

1

जावा आदिम प्रकारों में कोई विधि नहीं है। इसके बजाय आदिम डेटा प्रकारों का उपयोग रैपर वर्गों का उपयोग करें।

परिवर्तन

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

'==' 'तुलना करने के लिए 'के बराबर नहीं है लेकिन' बराबर' है। – Thomas

0

आदिम प्रकार एक तुलनित्र द्वारा सीधे तुलना नहीं की जा सकती है, बनाने के लिए, के रूप में इंटरफ़ेस केवल कॉललेटर और नियम BasedCollator द्वारा कार्यान्वित किया जाता है। कोई रैपर वर्ग तुलनित्र लागू करता है। जिसके कारण संकलक ऑटो बॉक्स को सक्षम नहीं कर पाएगा।

बस डबल क्लास में देखें और आपको एक इनबिल्ट विधि मिलेगी जो तुलना विधि प्रदान करती है।

public static int compare(double d1, double d2)

रिटर्न: मान 0 है, तो d1 संख्यानुसार d2 के बराबर है; 0 से कम मान यदि डी 1 संख्यात्मक रूप से डी 2 से कम है; और 0 से अधिक मान यदि डी 1 संख्यात्मक रूप से d2 से अधिक है।

रिवर्स: एकाधिक द्वारा पूरी अभिव्यक्ति -1;

संबंधित मुद्दे