2010-02-01 15 views
5

मैं जावा में एक तुलनित्र वर्ग मानचित्र प्रविष्टियों तुलना करने के लिए है:जावा डाली अनियंत्रित

warning: [unchecked] unchecked cast 
found : java.lang.Object 
required: java.util.Map.Entry<java.lang.Integer,java.lang.Double> 
      m1 = (Map.Entry<Integer, Double>)o1; 

मैं नक्शे पर प्रविष्टियों को क्रमबद्ध करने की जरूरत है:

public class ScoreComp implements Comparator<Object> { 

    public int compare(Object o1, Object o2) { 

     Entry<Integer, Double> m1 = null; 
     Entry<Integer, Double> m2 = null; 

     try { 
      m1 = (Map.Entry<Integer, Double>)o1; 
      m2 = (Map.Entry<Integer, Double>)o2; 
     } catch (ClassCastException ex){ 
      ex.printStackTrace(); 
     } 

     Double x = m1.getValue(); 
     Double y = m2.getValue(); 
     if (x < y) 
      return -1; 
     else if (x == y) 
      return 0; 
     else 
      return 1;   
    } 

} 

जब मैं इस कार्यक्रम को संकलित मैं निम्नलिखित मिल डबल मानों के आधार पर।

यदि मैं निम्नलिखित तुलनित्र बनाता हूं तो मुझे Arrays के फ़ंक्शन को सॉर्ट करने के लिए कॉल में एक त्रुटि मिलती है (मुझे मानचित्र से एक प्रविष्टि सेट मिल रहा है और फिर सेट को सरणी के रूप में उपयोग कर रहा है)।

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>> 

इस परिदृश्य को कैसे कार्यान्वित करें।

+0

क्या आप एक सरणी के रूप में सेट का उपयोग मतलब है: इसके बजाय, आप एक List और Collections.sort() विधि का उपयोग कर सकते हैं? – pgras

+0

स्टेकर के उत्तर के नीचे टिप्पणी देखें –

+0

इसमें अपवादों के साथ कुछ भी नहीं है; मैंने गलती के लिए खेद है कि –

उत्तर

2

स्टेकर ने आपके द्वारा दिखाए गए कोड को ठीक करने का वर्णन किया है। अपनी टिप्पणी में कोड को ठीक करने का तरीका यहां बताया गया है: सबसे पहले, सरणी का उपयोग न करें, क्योंकि सरणी जेनेरिक के साथ काम नहीं करती हैं (आपके पास सामान्य प्रकार की सरणी नहीं हो सकती है)।

List<Map.Entry<Integer, Double>> mList = 
     new ArrayList<Map.Entry<Integer, Double>>(Score.entrySet()); 
    Collections.sort(mList, new ScoreComp()); 
+0

मैं कैसे चाहता हूं कि मैं दो उत्तरों को सही के रूप में स्वीकार कर सकूं। आपका जवाब अच्छा है लेकिन मेरे काम के लिए मैं स्काफमैन के दृष्टिकोण का उपयोग करूँगा। –

2

क्या यह मानते हुए कि आप एक TreeMap सॉर्ट करने के लिए इस तुलनित्र का उपयोग कर रहे हैं, तो इस काम करने के लिए नहीं जा रहा है के रूप में

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>> { 

    public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) { 
     if (o1.getValue() < o2.getValue() ) return -1; 
     else if (o1.getValue() == o2.getValue() ) return 0; 
     return 1; 
    } 
} 
+0

तो मुझे सॉर्ट करने के लिए कॉल में एक त्रुटि मिलती है। '\t सेट > mSet = score.entrySet(); \t ऑब्जेक्ट [] arr = mSet.toArray(); \t Arrays.sort (एआर, नया स्कोरकंप()); ' –

+0

नहीं, यह काम नहीं करेगा, क्योंकि 'TreeMap' दिनचर्या' Map.Entry' मानों में नहीं गुजरती हैं, इससे कोई फर्क नहीं पड़ता कि आप कितनी मेहनत करने की कोशिश करते हैं यह – skaffman

+0

संकलित करता है ठीक है मेरे प्रश्न में कोड विंडोज़ पर नेटबीन के संस्करण 6.5 के साथ संकलित था। लेकिन यह लिनक्स पर नेटबीन 6.8 पर संकलित नहीं है। (जावा 1 है।6 पर - अजीब) –

4

पुनर्लेखन बारे में है। TreeMap तुलनित्र केवल कुंजी कुंजी की तुलना करने के लिए हैं, कुंजी-> मान प्रविष्टियां नहीं। यदि आपके तुलनित्र को मूल्यों तक पहुंच की आवश्यकता है, तो उसे मानचित्र में स्वयं देखना होगा, उदा।

final Map<Integer, Double> map = .... 

public class ScoreComp implements Comparator<Integer> { 
    public int compare(Integer key1, Integer key2) { 
    Double x = map.getValue(); 
    Double y = map.getValue(); 
    if (x < y) 
     return -1; 
    else if (x == y) 
     return 0; 
    else 
     return 1; 
    } 
} 

संपादित करें: अपनी टिप्पणी से, मुझे लगता है कि आपका सबसे अच्छा विकल्प, एक वर्ग है कि पहचान पत्र और मूल्य समाहित बनाने एक सूची में उन मूल्यों को डाल दिया, और कहा कि सॉर्ट करने के लिए है।

public class Item implements Comparable<Item> { 
    int id; 
    double value; 

    public int compareTo(Item other) { 
     return this.value - other.value; 
    } 
} 

और फिर

List<Item> list = new ArrayList<Item>(); 
// ... add items here 
Collections.sort(list); 

Item के बाद से ही Comparable है, तो आप की जरूरत नहीं है एक बाहरी Comparator (जब तक आप एक चाहते हैं)।

+0

क्या होगा यदि मुझे मूल्यों के आधार पर क्रमबद्ध करने की आवश्यकता है और मान अद्वितीय नहीं हैं ताकि चाबियाँ पूर्णांक होनी हों और मैं अपना कोड आसान दिखने के लिए कुंजी और मान को एक साथ रखना चाहता हूं समझने के लिए। –

+0

क्या आप वास्तव में किसी भी चीज़ के लिए इंटीजर मान का उपयोग कर रहे हैं? डबल्स को सिर्फ एक सूची में क्यों नहीं रखा गया है, और इसे हल करें? – skaffman

+0

मैं डबल मानों को क्रमबद्ध करने के बाद मुझे यह पहचानने में सक्षम होना चाहिए कि कौन सा डबल मान किस आईडी से संबंधित है। http://stackoverflow.com/questions/2145853/java-treemap-get-values-in-sorted-order –

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