2011-03-20 8 views
11

मुझे प्रत्येक पूर्व परिभाषित कुंजी-मूल्य जोड़े वाले हैंश मैप्स के एक ऐरेलिस्ट के साथ एक बाहरी एपीआई कॉल करने की आवश्यकता है। एक उदाहरण:हैश मैप्स के एक ऐरेलिस्ट को कितने प्रकार के कई महत्वपूर्ण मूल्य जोड़े रखते हैं?

ArrayList<HashMap<String, String>> arrayListHashMap = new ArrayList<HashMap<String, String>>(); 

    { 
     HashMap hashMap = new HashMap<String, String>(); 
     hashMap.put("key", "A key"); 
     hashMap.put("value", "B value"); 
     arrayListHashMap.add(hashMap); 
    } 

    { 
     HashMap hashMap = new HashMap<String, String>(); 
     hashMap.put("key", "B key"); 
     hashMap.put("value", "A value"); 
     arrayListHashMap.add(hashMap); 
    } 

अब मुझे "मूल्य" कुंजी की सामग्री पर इस निर्माण को सॉर्ट करने की आवश्यकता है। इस प्रकार के परिणामस्वरूप "key = b key/value = a value" प्रविष्टि arrayListHashMap में पहली बार होगी।

किसी भी मदद की अत्यधिक सराहना की जाती है।

HJW

उत्तर

31

आप एक Comparator<HashMap<String, String>> या अधिक सामान्यतः Comparator<Map<String, String>> जो सिर्फ value कुंजी के साथ assocated मूल्य निकालता है, तो Collections.sort का उपयोग लागू करने के लिए की जरूरत है। नमूना कोड (आप पर क्रमबद्ध करना चाहते हैं जो कुछ भी कुंजी के लिए सामान्यीकरण के साथ):

class MapComparator implements Comparator<Map<String, String>> 
{ 
    private final String key; 

    public MapComparator(String key) 
    { 
     this.key = key; 
    } 

    public int compare(Map<String, String> first, 
         Map<String, String> second) 
    { 
     // TODO: Null checking, both for maps and values 
     String firstValue = first.get(key); 
     String secondValue = second.get(key); 
     return firstValue.compareTo(secondValue); 
    } 
} 

... 
Collections.sort(arrayListHashMap, new MapComparator("value")); 
+0

धन्यवाद आपके तेज़ उत्तर के लिए बहुत कुछ। –

+0

हैलो, अगर मैं कुछ कस्टम मानदंडों को हल करना चाहता हूं तो क्या होगा? जैसे मेरे पास एक मूल्य है टेस्ट कहता है और मैं एक सूची को इस तरह से सॉर्ट करना चाहता हूं कि टेस्ट का सभी मूल्य पहले और फिर अन्य सभी को आता है। तो मूल रूप से यदि मेरे पास आकार की सूची है तो 10 कहें और उसमें यदि इसमें स्थिति 5 और 8 पर टेस्ट वैल्यू 2 गुणा है तो मैं दोनों को शीर्ष पर चाहता हूं। और उसके बाद के अन्य मूल्य होंगे .. क्या आप कृपया मुझे बताएं कि ऐसा कैसे करें .. – Scorpion

+0

@ स्कॉर्पियन: फिर आप एक तुलनित्र लिखते हैं जो परीक्षा के लिए जांच करता है और हमेशा किसी अन्य मूल्य से पहले जैसा व्यवहार करता है। आप में से कौन सा मुश्किल खोज रहे हैं? (यह शायद एक नए प्रश्न के रूप में सबसे अच्छा होगा ...) –

0

(यह पूछा प्रश्न का उत्तर नहीं है - जॉन पहले से ही ऐसा किया -, लेकिन टिप्पणी क्षेत्र इस के लिए बहुत छोटा है।)

आपकी डेटा संरचना आपको दिखती है कि आप मानचित्र की कुंजी-मूल्य संरचना (और आपके उदाहरण में हैश मानचित्र) को गलत समझाते हैं।

एक मानचित्र में कुंजी की संख्या हो सकती है, और प्रत्येक कुंजी के लिए भी एक मान हो सकता है। कुंजी और मान की एक जोड़ी Map.Entry द्वारा दी जाती है (जिसे मानचित्र के entrySet() विधि द्वारा प्राप्त किया जा सकता है)। यदि आप कुंजी से सॉर्ट करना चाहते हैं, तो सामान्य हैश मैप के बजाय बस सॉर्टेड मैप (जैसे ट्रीमैप) का उपयोग करें।

आप एक HashMap द्वारा प्रत्येक व्यक्ति प्रविष्टियों का अनुकरण कर रहे है, तो उन सब को एक ArrayList में डाल ...: -/

यहाँ मैं अपने उदाहरण में क्या किया होता:

Map<String, String> map = new TreeMap<String, String>(); 
map.put("B key", "B value"); 
map.put("A key", "B value"); 

System.out.println(map); // already sorted 
+1

आपके उत्तर के लिए धन्यवाद। मुझे बाहरी एपीआई को खिलाने की ज़रूरत है - विचार मेरा नहीं है। मैं समझता हूं कि वे डेटाबेस क्वेरी परिणाम जैसे कुछ अनुकरण करते हैं। ArrayList क्वेरी परिणाम है, प्रत्येक हैश मैप एक रिकॉर्ड है और प्रत्येक प्रविष्टि एक फ़ील्डनाम है और इसका मान है। "कुंजी" एक फ़ील्ड और "मूल्य" एक और होगा। ऐसा लगता है कि मुझे उदाहरण में दो प्रविष्टियों के लिए अलग-अलग नामों का उपयोग करना चाहिए था। "कुंजी" और "मान" के बजाय बस "फ़ील्ड 1" और "फ़ील्ड 2" लें। गलतफहमी के लिए खेद है। –

+0

बाहरी एपीआई वास्तव में javabeans की एक सूची का उपयोग करना चाहिए। – BalusC

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