bagaimana cara mengurutkan daftar di Scala dengan dua bidang, dalam contoh ini saya akan mengurutkan berdasarkan nama belakang dan nama depan?
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)
Saya mencoba hal-hal seperti ini
rows.sortBy(_.lastName + _.firstName)
tapi tidak berhasil. Jadi saya penasaran dengan solusi yang baik dan mudah.
scala
sorting
functional-programming
Twistleton
sumber
sumber
Ordering
untukRow
kelas dan menggunakannya dengansorted
metode seperti ini:rows.sorted(customOrdering)
. Anda juga bisa menggunakan kustomOrdering
untukTuple2
seperti ini:rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
.customOrdering
sebagaiOrdering[Row]
manual atau menggunakanOrdering.by
seperti ini:val customOrdering =
Ordering.by ((r: Row) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `rows.sortBy(r => (-r.field1, -r.field2))
-
denganString
. Anda harus menggunakanOrdering::reverse
cara ini:rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
.Jika Anda ingin mengurutkan menurut nama yang digabungkan, seperti dalam pertanyaan Anda, atau
jika Anda ingin mengurutkan berdasarkan nama belakang, kemudian nama depan; relevan untuk nama yang lebih panjang (Wild, Wilder, Wilderman).
Jika Anda menulis
dengan 2 garis bawah, metode ini mengharapkan dua parameter:
sumber
Secara umum, jika Anda menggunakan algoritme pengurutan yang stabil, Anda dapat mengurutkan berdasarkan satu kunci, lalu kunci berikutnya.
Hasil akhir akan diurutkan berdasarkan nama belakang, lalu di mana itu sama, dengan nama depan.
sumber
sortBy
menggunakan jenis stabil? Kalau tidak, jawaban ini tidak ada artinya.rows
adalah daftar yang tidak dapat diubah dansortBy
mengembalikan nilai baru daripada mengubah nilai yang digunakan (bahkan dalam kelas yang dapat berubah). Jadi ekspresi kedua Anda hanya mengurutkan daftar asli yang tidak diurutkan.Mungkin ini hanya berfungsi untuk Daftar Tupel, tetapi
tampaknya berhasil dan menjadi cara sederhana untuk mengekspresikannya.
sumber