2

私は定義しました

case class User(var firstName: String, var lastName: String, var city: String, var price: Int)

そしてソートしたい

val users = List(
  User("Peter", "Fox", "Berlin", 30),
  User("Otto",  "Schmidt", "Berlin", 20),
  User("Carl",  "Schmidt", "Berlin", 30),
  User("Igor",  "Schmidt", "Berlin", 10),
  User("Hugo",  "Schmidt", "Berlin", 50))

私はこれを行うことができます

val sorted = users.sortBy(p => (p.lastName,p.firstName))

このようなシーケンスでソート基準を sortBy に与えることは可能ですか?

val sortCriteria = Seq(lastname,firstname)
val sorted = test.sortBy(p => sortCriteria)

考えられるすべての組み合わせを定義せずに、1 ~ n 個の引数を使用して、ユーザーの要求によってシーケンス内の条件を組み合わせたいと考えています。

4

4 に答える 4

1

Tupleではなく、を使用する必要がありますSeq

  def sortCritera(user: User): Tuple2[String, String] = (user.firstName, user.lastName)
  println(users.sortBy(user => sortCritera(user)));

  def sortCritera2(user: User): Tuple3[String, String, String] = (user.city, user.firstName, user.lastName)
  println(users.sortBy(user => sortCritera(user)));
于 2013-08-14T15:57:34.177 に答える
0

さて、あなたはこのようなことをすることができます。内部的には安定した並べ替え (Merge Sort) を使用するため、以下の解決策が機能します。

val order = List("lastName","firstName")

def sort(ls:List[User],n:String) = n match {
  case "firstName" => ls.sortBy(p => p.firstName)
  case "lastName" => ls.sortBy(p => p.lastName)
  case "city" => ls.sortBy(p => p.city)
  case "price" => ls.sortBy(p => p.price)
}

order.reverse.foldLeft(users)((all,param) => sort(all,param))

基本的に逆順で、firstName最初にソートします。そして、 で並べ替えますlastName

これにより、次と同じ結果が得られますusers.sortBy(p => (p.lastName,p.firstName))

于 2013-08-14T15:38:22.067 に答える