そういう文字列を作って、その文字列でソートすればいいのでは?
scala
1val members = Seq(Takahashi, Suzuki, Nakamura)
2
3// idでソートし、idが同じの場合は身長でソート、それでも同じ場合は、体重でソート
4scala> members.sortBy{x => "%04d %04d %04d".format(x.id, x.height, x.weight)}
5res14: Seq[Member] = List(Member(1,170,60), Member(2,170,55), Member(3,180,60))
6
7// 身長でソートし、同じの場合はidでソート、それでも同じ場合は体重でソート
8scala> members.sortBy{x => "%04d %04d %04d".format(x.height, x.id, x.weight)}
9res15: Seq[Member] = List(Member(1,170,60), Member(2,170,55), Member(3,180,60))
むむ?
random_2の場合は、身長でソートし、同じの場合はidでソート、それでも同じ場合は体重でソート
// 求めたい結果
List(Member(3,180,60), Member(1,170,60), Member(2,170,55))
「身長でソートし」ではなく、「身長を降順ソートし」かよ。
scala
1scala> members.sortBy{x => "%04d %04d %04d".format(10000-x.height, x.id, x.weight)}
2res4: Seq[Member] = List(Member(3,180,60), Member(1,170,60), Member(2,170,55))
randomの意味役割を理解できていませんでした。そこを理解できたつもりで、追記。
scala
1...
2val random = Seq(1,2,3)
3val random_2 = Seq(2,1,3)
4
5def sss(members: Seq[Member], randomKey: Seq[Int]): Seq[Member] =
6 members.sortBy{
7 x =>
8 randomKey.map{
9 _ match {
10 case 1 => x.id
11 case 2 => 10000 - x.height
12 case 3 => x.weight
13 }
14 }
15 .map{"%04d".format(_)}
16 .mkString(" ")
17 }
18
19val aa = sss(members, random)
20println(s" keys: ${random}")
21println(s"result: ${aa}")
22
23val bb = sss(members, random_2)
24println(s" keys: ${random_2}")
25println(s"result: ${bb}")
26
27val random_3 = Seq(3,2,1)
28
29val cc = sss(members, random_3)
30println(s" keys: ${random_3}")
31println(s"result: ${cc}")
32
33
34// keys: List(1, 2, 3)
35// result: List(Member(1,170,60), Member(2,170,55), Member(3,180,60))
36// keys: List(2, 1, 3)
37// result: List(Member(3,180,60), Member(1,170,60), Member(2,170,55))
38// keys: List(3, 2, 1)
39// result: List(Member(2,170,55), Member(3,180,60), Member(1,170,60))
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/18 14:02
2021/08/18 20:37