2010-09-14 12 views
10

का उपयोग कर फ्लोट सदस्य चर की तुलना करने में सहायता करें मैं स्ट्रिंग्स जुर्माना की तुलना करने में सक्षम हूं, लेकिन जानना चाहता हूं कि मैं फ़्लोटिंग पॉइंट नंबर कैसे रैंक कर सकता हूं?तुलनात्मक

getChange() एक स्ट्रिंग देता है। मैं उतरने को क्रमबद्ध करने में सक्षम होना चाहता हूँ। मैं यह कैसे कर सकता हूँ?

अद्यतन:

package org.stocktwits.helper; 

import java.util.Comparator; 

import org.stocktwits.model.Quote; 

public class ChangeComparator implements Comparator<Quote> 
{ 
    public int compare(Quote o1, Quote o2) { 
     float change1 = Float.valueOf(o1.getChange()); 
     float change2 = Float.valueOf(o2.getChange()); 

     if (change1 < change2) return -1; 
     if (change1 == change2) return 0; // Fails on NaN however, not sure what you want 
     if (change2 > change2) return 1; 
    } 
} 

मैं संकलन समय त्रुटि हो रही है:

This method must return a result of type int ChangeComparator.java 
+0

, आप अपने कोड में कोई गारंटी वापसी कथन है। वास्तव में आप करते हैं, लेकिन संकलक यह नहीं बता सकता क्योंकि आपके पास बयान के तीन अलग-अलग हैं। यह रनटाइम तक उन लोगों का मूल्यांकन नहीं कर सकता है, इसलिए ऐसा लगता है कि आप वास्तव में आखिरी वक्तव्य प्राप्त कर सकते हैं और कोई रिटर्न क्लॉज नहीं है। – Matt

उत्तर

12

Comparator#compare() विधि के जावाडोक पढ़ें।

Compares its two arguments for order. Returns a negative integer, zero or a positive integer as the first argument is less than, equal to or greater than the second.

तो, मूल रूप से:

float change1 = o1.getChange(); 
float change2 = o2.getChange(); 
if (change1 < change2) return -1; 
if (change1 > change2) return 1; 
return 0; 

या अगर आप की तरह सशर्त ऑपरेटरों:

return o1.getChange() < o2.getChange() ? -1 
    : o1.getChange() > o2.getChange() ? 1 
    : 0; 

आप तथापि Float.NaN साथ खातों को भी लेने की जरूरत है। मुझे यकीन नहीं है कि आप उन्हें आदेश कैसे देना चाहते हैं। प्रथम? पिछले? समान रूप से?

+0

फ़्लोट.NAN के लिए देखें! मुझे लगता है कि आपके डेटा में NaNs नहीं है, लेकिन चूंकि किसी भी तुलना के एक तरफ NaN हमेशा झूठी वापसी करेगा (यहां तक ​​कि फ़्लोट भी।NaN == Float.NaN झूठा है!), आप एक Float.isNaN (change1) या जो कुछ भी जांच सकते हैं। अन्यथा नाइन के शामिल होने पर सॉर्ट स्पष्ट रूप से यादृच्छिक होगा। –

+0

मुझे संकलन समय त्रुटि मिल रही है (मेरे प्रश्न में अद्यतन कोड देखें): इस विधि को टाइप int \t ChangeComparator.java –

+0

का परिणाम वापस करना होगा संकलन त्रुटि स्वयं के लिए बोलती है। आपको यह सुनिश्चित करने की ज़रूरत है कि यह ** हमेशा ** 'int' लौटाता है। मैं उदाहरण संपादित करूंगा। – BalusC

13

कैसे इस बारे में:

public class ChangeComparator implements Comparator<Quote> 
{ 
    public int compare(Quote o1, Quote o2) { 
     Float change1 = Float.valueOf(o1.getChange()); 
     Float change2 = Float.valueOf(o2.getChange()); 
     return change1.compareTo(change2); 
    } 
} 

ध्यान दें कि जावा 1.4 की शुरुआत की Float#compare(float, float) (और Double में एक बराबर) है, जो काफी सीधे इस्तेमाल किया जा सकता है:

public class ChangeComparator implements Comparator<Quote> 
{ 
    public int compare(Quote o1, Quote o2) { 
     return Float.compare(o1.getChange(), o2.getChange()); 
    } 
} 

(संपादन के बाद, मैं नोटिस कि @ BorislavGizdov ने पहले ही अपने उत्तर में इसका उल्लेख किया है।)


यह भी ध्यान देने योग्य है कि जावा 8 Comparator#comparing(...) और Comparator#comparingDouble(...) इन तुलनाकर्ताओं को सीधे बनाने का एक सीधा तरीका प्रदान करते हैं।

Comparator<Quote> changeComparator = Comparator.comparing(Quote::getChange); 

बॉक्सिंग Float मानों का उपयोग की तुलना करेंगे।

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange); 

float मूल्यों double मूल्यों के लिए प्रोत्साहित का उपयोग कर की तुलना करेंगे।

यह देखते हुए कि Comparator#comparingFloat(...) नहीं है, मेरी प्राथमिकता comparingDouble(...) विधि का उपयोग करना होगा, क्योंकि इसमें केवल मुक्केबाजी के बजाय आदिम प्रकार का रूपांतरण शामिल है।

+4

यह सबसे अच्छा जवाब है - फ़्लोट की तुलना करने के लिए तुलना करें। –

8

आप Float.compare(float f1, float f2) उपयोग कर सकते हैं: NaN मुद्दे के अलावा

public static int compare(float f1, float f2) 

Compares the two specified float values. Returns the value 0 if f1 is numerically equal to f2; a value less than 0 if f1 is numerically less than f2; and a value greater than 0 if f1 is numerically greater than f2.

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