2016-05-16 15 views
65

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

एक सी # -Background से आ रहा है, मैं आसानी से इस में प्राप्त कर सकते हैं ने कहा कि LINQ का उपयोग करके भाषा:

var list=new List<Person>(); 
list.Add(new Person(25, "Tom")); 
list.Add(new Person(25, "Dave")); 
list.Add(new Person(20, "Kate")); 
list.Add(new Person(20, "Alice")); 

//will produce: Alice, Kate, Dave, Tom 
var sortedList=list.OrderBy(person => person.Age).ThenBy(person => person.Name).ToList(); 

इस Kotlin का उपयोग कर कैसे पूरा करता है?

यह है कि मैं क्या करने की कोशिश की है (यह स्पष्ट रूप से गलत है के बाद से पहली "sortedBy" खंड के उत्पादन में दूसरा एक जो केवल नाम के अनुसार क्रमबद्ध एक सूची में जो परिणाम द्वारा ओवरराइड हो जाता है)

val sortedList = ArrayList(list.sortedBy { it.age }.sortedBy { it.name })) //wrong 

उत्तर

110

sortedWith + compareBy (lambdas के vararg) ले जा रहा है चाल:

:

val sortedList = list.sortedWith(compareBy({ it.age }, { it.name })) 

तुम भी कुछ और अधिक संक्षिप्त प्रतिदेय संदर्भ सिंटैक्स का उपयोग कर सकते हैं

+1

कोटलिन एक देवता है – ElliotM

38

Comparator के साथ सूची क्रमबद्ध करने के लिए sortedWith का उपयोग करें।

फिर आप कई तरीके का उपयोग कर एक तुलनित्र का निर्माण कर सकते हैं:

list.sortedWith(compareBy<Person> { it.age }.thenBy { it.name }.thenBy { it.address }) 
  • compareBy एक अधिभार है जो कई कार्यों लेता है:

    • compareBy, thenBy कॉल की एक श्रृंखला में तुलनित्र का निर्माण:

      list.sortedWith(compareBy({ it.age }, { it.name }, { it.address })) 
      
  • +0

    धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था! मैं कोटलिन के लिए थोड़ा नया हूं, आपको अपने पहले बुलेट प्वाइंट में 'तुलना करें' की तुलना में '' की तुलना करने की आवश्यकता क्यों है? – Aneem

    +0

    @ एनीम, कोटलिन कंपाइलर कभी-कभी प्रकार तर्क का अनुमान लगाने में असमर्थ होता है, और इसे मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता होती है। ऐसा एक मामला तब होता है जब एक सामान्य प्रकार की अपेक्षा की जाती है, और आप जेनेरिक फ़ंक्शंस कॉल चेन के परिणाम को पास करना चाहते हैं, जैसे 'तुलना {it.age} .thenBy {it.name} .thenBy {it.address} '। दूसरे बिंदु पर, केवल एक फ़ंक्शन कॉल है, कोई कॉल चेनिंग नहीं है: 'तुलना करें ({it.age}, {it.name}, {it.address}) '। – hotkey