কার্য:
আপনার peopleক্লাসের অবজেক্টের একটি তালিকা রয়েছে Personযা ক্ষেত্রগুলি nameএবং age। আপনার কাজটি এই তালিকাটিকে প্রথমে nameএবং তারপরে বাছাই করা age।
জাভা 7:
Collections.sort(people, new Comparator<Person>() {
public int compare(Person a, Person b) {
return a.getName().compare(b.getName());
}
});
Collections.sort(people, new Comparator<Person>() {
public int compare(Person a, Person b) {
return Integer.valueOf(a.getAge()).compare(b.getAge());
}
});
স্কেল:
val sortedPeople = people.sortBy(p => (p.name, p.age))
হালনাগাদ
যেহেতু আমি এই উত্তরটি লিখেছি, বেশ কিছুটা অগ্রগতি হয়েছে। ল্যাম্বডাস (এবং পদ্ধতির উল্লেখগুলি) অবশেষে জাভাতে অবতরণ করেছে এবং তারা ঝড়ের দ্বারা জাভা বিশ্বকে নিয়ে যাচ্ছে।
উপরের কোডটি জাভা 8 এর সাথে দেখতে (যা ফ্রেডওভারফ্লো দ্বারা অবদান রেখেছেন) এর মতো হবে:
people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
যদিও এই কোডটি প্রায় সংক্ষিপ্ত, এটি স্কালাল কোডের মতো পুরো মার্জিতভাবে কাজ করে না।
Scala সমাধান ইন, Seq[A]#sortByপদ্ধতি একটি ফাংশন গ্রহণ A => Bযেখানে Bপ্রয়োজন বোধ করা হয় আছে একটি Ordering। Orderingএকটি টাইপ-ক্লাস। উভয় জগতের সেরা চিন্তা করুন: যেমন Comparable, এটি প্রশ্নের ধরণের জন্য অন্তর্নিহিত, তবে Comparatorএটির মতো এটি এক্সটেনসিবল এবং প্রবণতা অনুসারে এটি যুক্ত না করে এমন সংখ্যায় যুক্ত হতে পারে। যেহেতু জাভাতে টাইপ-ক্লাসের অভাব রয়েছে, তাই এ জাতীয় প্রতিটি পদ্ধতির নকল করতে হবে, একবারের জন্য Comparable, তারপরেও Comparator। উদাহরণস্বরূপ, দেখুন comparingএবং thenComparing এখানে ।
টাইপ-ক্লাসগুলি একজনকে এমন নিয়ম লেখার অনুমতি দেয় যেমন "যদি A এর অর্ডার থাকে এবং B এর অর্ডার থাকে তবে তাদের টিপল (A, B) এরও অর্ডার থাকে"। কোডে, এটি হ'ল:
implicit def pairOrdering[A : Ordering, B : Ordering]: Ordering[(A, B)] = // impl
আমাদের কোডটিতে এইভাবে sortByনাম অনুসারে এবং তারপরে বয়সের সাথে তুলনা করা যায়। এই শব্দার্থকগুলি উপরের "বিধি" দিয়ে এনকোড করা হবে। একটি স্কালা প্রোগ্রামার স্বজ্ঞাতভাবে এইভাবে এটি কাজ করবে বলে আশা করবে। এর মতো কোনও বিশেষ উদ্দেশ্য পদ্ধতি comparingযুক্ত করা হয়নিOrdering ।
লাম্বডাস এবং পদ্ধতির উল্লেখগুলি হ'ল আইসবার্গের একটি টিপ যা কার্যকরী প্রোগ্রামিং। :)