দুটি ক্ষেত্র দ্বারা স্কালায় একটি তালিকা বাছাই কিভাবে?


101

দুটি ক্ষেত্র দ্বারা স্কালায় একটি তালিকা বাছাই কিভাবে, এই উদাহরণে আমি সর্বশেষে এবং ফার্স্টনেম অনুসারে বাছাই করব?

case class Row(var firstName: String, var lastName: String, var city: String)

var rows = List(new Row("Oscar", "Wilde", "London"),
                new Row("Otto",  "Swift", "Berlin"),
                new Row("Carl",  "Swift", "Paris"),
                new Row("Hans",  "Swift", "Dublin"),
                new Row("Hugo",  "Swift", "Sligo"))

rows.sortBy(_.lastName)

আমি এই মত জিনিস চেষ্টা

rows.sortBy(_.lastName + _.firstName)

কিন্তু এটি কাজ করে না। সুতরাং আমি একটি ভাল এবং সহজ সমাধান জন্য কৌতূহলী।

উত্তর:


216
rows.sortBy(r => (r.lastName, r.firstName))

4
আমরা যদি লাস্টনামে বাছাই করতে চাই এবং প্রথমে নেমে প্রাকৃতিক সাজান?
শচীন কে

14
@SachinK: আপনি আপনার নিজের তৈরি আছে Orderingজন্য Rowশ্রেণী এবং সঙ্গে এটি ব্যবহার sortedভালো পদ্ধতি: rows.sorted(customOrdering)। এছাড়াও আপনি কাস্টম ব্যবহার করতে পারে Orderingজন্য Tuple2ভালো: rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
সেনিয়া

5
@SachinK: আপনি বাস্তবায়ন হতে পারে customOrderingযেমন Ordering[Row]হস্তচালিত বা ব্যবহার Ordering.by: এই মত val customOrdering = Ordering.by ((R: ROW) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `
সেনিয়া

1
চমৎকার। বা অবতরণ অনুসারে বাছাই করতেrows.sortBy(r => (-r.field1, -r.field2))
ব্রেন্ট ফাউস্ট

@BrentFaust আপনি ব্যবহার করতে পারবেন না -সঙ্গে String। আপনি ব্যবহার করা উচিত Ordering::reverseএভাবে: rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
সেনিয়া

12
rows.sortBy (row => row.lastName + row.firstName)

আপনি যদি মার্জ করা নামগুলি অনুসারে বাছাই করতে চান তবে আপনার প্রশ্নে বা

rows.sortBy (row => (row.lastName, row.firstName))

আপনি যদি সর্বশেষ নাম অনুসারে বাছাই করতে চান তবে ফার্স্টনাম; দীর্ঘ নামের জন্য প্রাসঙ্গিক (ওয়াইল্ড, ওয়াইল্ডার, ওয়াইল্ডম্যান)।

যদি লিখি

rows.sortBy(_.lastName + _.firstName)

2 টি আন্ডারলাইন সহ, পদ্ধতিটি দুটি পরামিতিগুলি প্রত্যাশা করে:

<console>:14: error: wrong number of parameters; expected = 1
       rows.sortBy (_.lastName + _.firstName)
                               ^

1
এর ক্রমটি সম্ভবত প্রথম নাম অনুসারে বাছাই করা নাম অনুসারে বাছাইয়ের মতো হবে না।
মার্সিন

1
বিশেষত, যখন শেষ নামগুলি পৃথক দৈর্ঘ্যের হয়
লুইজি প্লিঞ্জ

7

সাধারণভাবে, আপনি যদি একটি স্থিতিশীল বাছাই অ্যালগরিদম ব্যবহার করেন, আপনি কেবল একটি কী দ্বারা সারণি করতে পারেন, তারপরে পরেরটি।

rows.sortBy(_.firstName).sortBy(_.lastName)

চূড়ান্ত ফলাফলটি সর্বশেষ নাম অনুসারে বাছাই করা হবে, তারপরে যেখানে এটি সমান, প্রথম নাম অনুসারে।


আপনি কি নিশ্চিত যে স্কেলা sortByস্থিতিশীল বাছাই ব্যবহার করে? অন্যথায় এই উত্তরটি অর্থহীন।
সর্বজনীন-মনোনীত

1
@ ওম-নম-নোম: স্কালা - অংগ.অর্গ / অ্যাপি / সারেন্ট / এসকালা / ইউটি / সোর্টিং$.চিটএমএল কুইকসোর্ট কেবলমাত্র মান ধরণের জন্য সংজ্ঞায়িত, তাই হ্যাঁ।
মার্সিন

1
rowsএকটি অপরিবর্তনীয় তালিকা এবং sortByএটি যেটির উপর নির্ভর করে তা পরিবর্তনের পরিবর্তে একটি নতুন মান প্রদান করে (এমনকি পরিবর্তনযোগ্য শ্রেণিতেও)। সুতরাং আপনার দ্বিতীয় এক্সপ্রেশনটি কেবল মূল অরসেটেড তালিকাকে বাছাই করছে।
লুইজি প্লিঞ্জ

3
স্কলার, বাছাইয়ের পদ্ধতি অনুসারে java.util.Arrays.sort ব্যবহার করে যা বস্তুর অ্যারে স্থিতিশীল হওয়ার গ্যারান্টি দেয়। সুতরাং, হ্যাঁ, এই সমাধানটি সঠিক। (এটি স্কেলা ২.১০ এ পরীক্ষা করা হয়েছে)
মার্সিন পাইকিউইউকিউজ

1
এই বনামের পারফরম্যান্স সম্পর্কে ভাবা আকর্ষণীয় a এই পদ্ধতির সাথে আপনাকে অবশ্যই এই টিউপসগুলি তৈরি করতে হবে না, তবে টিপল পদ্ধতির সাথে আপনাকে কেবল প্রথম নামগুলির সাথে তুলনা করতে হবে যেখানে শেষ নামগুলি মিলে। তবে আমি মনে করি এটির কোনও গুরুত্ব নেই - আপনি যদি পারফরম্যান্স-সমালোচনামূলক কোডটি লিখছেন তবে আপনার বাছাই করা উচিত নয় বাছাই করে বাই!
অ্যামিগনিকো

-3

সম্ভবত এটি কেবল টিপলগুলির তালিকার জন্য কাজ করে তবে

scala> var zz = List((1, 0.1), (2, 0.5), (3, 0.6), (4, 0.3), (5, 0.1))
zz: List[(Int, Double)] = List((1,0.1), (2,0.5), (3,0.6), (4,0.3), (5,0.1))

scala> zz.sortBy( x => (-x._2, x._1))
res54: List[(Int, Double)] = List((3,0.6), (2,0.5), (4,0.3), (1,0.1), (5,0.1))

কাজ করে এবং এটি প্রকাশ করার সহজ উপায় বলে মনে হয়।


তবে স্ট্রিংয়ের জন্য কাজ করে না, যা ওপি বাছাই করছে।
আরকিটিপাল পল

এই প্রশ্নের ইতিমধ্যে বেশ কয়েকটি ভাল উত্তর পেয়েছে যা টিপলগুলির তালিকায় সীমাবদ্ধ নয়। তাহলে এটি পোস্ট করার কারণ কী?
হন্ক

@ হংক: পূর্বের সমাধানগুলি টিপলসের তালিকায় আসলে কাজ করে না (এএএএএফসিটি)। আমি যদি স্কালার নবাগত না হয়ে থাকি তবে সম্ভবত আমি বুঝতে পারি যে সেই ক্ষেত্রে কাজ করার জন্য পূর্ববর্তী সমাধানগুলি কীভাবে রূপান্তর করা যায় তবে আজ আমি তা করি না। আমি ভেবেছিলাম যে আমার উত্তরটি অন্য স্কালার নবাগতকে আমি করার চেষ্টা করছিলাম তেমন কাজ করতে পারে।
স্প্রেইনহার্ট

@ ব্যবহারকারী3508605: আপনার অবদানের জন্য আপনার ইচ্ছাটির আমি কৃতজ্ঞ যাইহোক, স্ট্যাক ওভারফ্লো ধারণাটি নির্দিষ্ট সমস্যাগুলির সাথে প্রশ্ন থাকা (যেমন এটি এখানে যেমন রয়েছে) এবং উত্তর দেয় যা সেই নির্দিষ্ট সমস্যাগুলির সমাধান করে (এবং কেবল সেগুলি)। আপনার উত্তরটি একটি ভিন্ন সমস্যার সমাধান দেয়। সুতরাং এটি পোস্ট করার জন্য এটি ভুল জায়গা। আপনি যদি মনে করেন যে আপনার উত্তরটি মূল্যবান, তবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন। নতুন প্রশ্নে আপনার সম্পর্কিত সমস্যা বর্ণনা করুন এবং তারপরে আপনার উত্তরটি সেখানে পোস্ট করুন। অবশেষে আপনার উত্তর এখানে সরাতে ভুলবেন না। আপনার সহযোগিতার জন্য ধন্যবাদ!
হংক

@ হংক: অবশ্যই, আমি আমার উত্তরটি একটি পৃথক প্রশ্নের দিকে নিয়ে যাব। এবং, যদি আমি এই প্রশ্নের পূর্ববর্তী উত্তরটিতে একটি মন্তব্য যুক্ত করতে আপনাকে চাপিয়ে দিতে পারি (মার্কিন থেকে), এটি ঠিক ভুল বলে মনে হচ্ছে। (এটিতে পোস্ট করতে সক্ষম হওয়ার মতো পর্যাপ্ত বিশ্বাসযোগ্যতা পয়েন্ট আমার কাছে নেই)) এই উত্তরের উদাহরণটি প্রথমে একটি কী দ্বারা বাছাই করে এবং তারপরে আবার একটি আলাদা কী দ্বারা পুনরায় বাছাই করে কার্যকরভাবে প্রথম সাজানোর ফলাফলগুলি সরিয়ে দেয়। কমপক্ষে টিপলসের তালিকায় এটি করে।
স্প্রেইনহার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.