2017-11-22 32 views
6

मेरे पास नीचे दिए गए मानचित्रों की एक सूची है। मैं जावा 8 में कस्टम ऑर्डर में सूची के अंदर नक्शे को सॉर्ट करना चाहता हूं।जावा में कस्टम सॉर्ट मैप्स 8

उदाहरण के लिए, नक्शे की सूची नीचे दी गई है।

[{model=Ferrari}, 
{model=Tesla}, 
{model=Benz}, 
{model=Honda}] 

अगर मैं नक्शे नीचे कोड, वर्णमाला क्रम में इसकी छंटाई का उपयोग कर की उपरोक्त सूची को सॉर्ट।

l.sort(Comparator.comparing((Map<String,String> mp) -> mp.get("model"))); 

नीचे आउटपुट देता है।

[{मॉडल = बेंज} {मॉडल = फेरारी} {मॉडल = होंडा} {मॉडल = टेस्ला}]

लेकिन मैं नहीं आदेश के आधार पर इस नक्शे को सॉर्ट करने के लिए (की जरूरत है वर्णमाला क्रम): होंडा, टेस्ला, बेंज, फेरारी

क्या कोई बेहतर तरीका है कि हम जावा 8 में कस्टम सॉर्ट प्राप्त कर सकते हैं?

+0

साथ आप एक कस्टम आदेश चाहते हैं इसे कहीं परिभाषित किया जाना है हल किया जा सकता। उदाहरण के लिए, आप अपने प्रत्येक मानचित्र, "ऑर्डर = 1" या कुछ में दूसरी प्रविष्टि जोड़ सकते हैं। –

+3

यदि आप सूची में '["होंडा", "टेस्ला", "बेंज", "फेरारी"] डालते हैं, तो आप उस सूची में मॉडल की अनुक्रमणिका द्वारा क्रमबद्ध कर सकते हैं। – khelwood

+0

@ शेल्वुड अच्छा विचार है। मुझे आपके सुझाव का प्रयास करने दो। –

उत्तर

6

आपको इस कोड के बाहर कहीं भी अपना पसंदीदा ऑर्डर परिभाषित करना चाहिए। इसे किसी प्रकार की सूची में रखें और उसके बाद इसे मॉडल नाम के मानचित्र में बदलें -> अनुक्रमणिका।

Map<String,Integer> modelOrder = ..... 

, तो आप तुलना के लिए क्रमिक प्राप्त करने के लिए एक और लुकअप जोड़ सकते हैं।

l.sort(Comparator.comparing((Map<String,String> mp) -> 
    modelOrder.get(mp.get("model")))); 

अगर अज्ञात मॉडल का सामना करना पड़ता है तो यह आपके चेहरे में विस्फोट हो जाएगा। तुम बहुत अंत में अज्ञात मॉडल डाल करने के लिए

l.sort(Comparator.comparing((Map<String,String> mp) -> 
    modelOrder.getOrDefault(mp.get("model"),Integer.MAX_VALUE))); 

की तरह कुछ द्वारा त्वरित सुधार कर सकते हैं, लेकिन वे खुद के बीच हल नहीं किया जाएगा (तो भी एक ही अज्ञात मॉडल अन्य अज्ञात लोगों द्वारा interlaced जा सकता है)।

संपादित करें: लोगों

के रूप में टिप्पणी में सुझाव दिया है, यह अच्छी तरह से .thenComparing

l.sort(Comparator 
    .comparing((Map<String,String> mp) -> modelOrder.getOrDefault(mp.get("model"),Integer.MAX_VALUE)) 
    .thenComparing((Map<String,String> mp) -> mp.get("model"))); 
+1

'(लंबा) (Math.abs (mp.get (" model ") जैसे कुछ का उपयोग करने में सक्षम होना चाहिए। हैशकोड())) + modelOrder.size() 'अज्ञात सॉर्ट करने के लिए डिफ़ॉल्ट मान के रूप में। लंबे समय तक उपयोग हैशकोड से ओवरफ्लो को रोकने के लिए है, और modelOrder.size() को ज्ञात मॉडल के बाद यह सुनिश्चित करना चाहिए। कुल मिलाकर यह थोड़ा अधिक हो सकता है – phflack

+0

या अगर वे सूची में नहीं हैं ('getOrDefault()' की तुलना करने के बाद) स्ट्रिंग की तुलना करने के लिए 'तो कॉम्पैरिंग (modelOrder.get (mp.get ("model")) का उपयोग करें। –

+0

@ डिडिएर एल: आप अतिरिक्त मानचित्र लुकअप करने से बच सकते हैं, 'Comparator.comparing (mp -> mp.get ("model"), तुलनात्मक।comparingInt ((स्ट्रिंग एस) -> modelOrder.getOrDefault (एस, Integer.MAX_VALUE)) .thenComparing (Comparator.naturalOrder())) ' – Holger

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