【问题标题】:Scala dynamic list sortingScala动态列表排序
【发布时间】:2019-07-15 18:28:43
【问题描述】:

我正在寻找一种干净的方式来动态排序具有以下要求的列表。

case class Person(name: String, middleName:Option[String], age:Integer) 

现在排序非常简单,但是如果这种排序是从用户执行列排序的 UI 驱动的,并且传递回服务器的参数将只是列名。有什么建议可以动态创建这种排序功能吗?

提前致谢

**更新:

val sortByName = (p :Person) => p.name
val sortByMiddleName = (p: Person) => p.middleName

val mySortMap = Map("name" -> sortByName, "middleName" -> sortByMiddleName)

val sorted = persons.sortBy(mySortMap("name"))

** 更新 #2

import scala.math.Ordering.Implicits._

type PersonSorter = (Person, Person) => Boolean
val sortByName: PersonSorter = (x:Person, y:Person) => x.name < y.name
// Implicits import takes care of the Option here...
val sortByMiddleName: PersonSorter = (x:Person, y:Person) => x.middleName < y.middleName

val sortingMap: PersonSorter = Map[String, PersonSorter]("name" -> sortByName, "middleName" -> sortByMiddleName)

(不包括年龄,但完全一样)

现在,当我有我的清单时,我可以轻松地做到这一点。

persons.sortWith(sortingMap("name"))

其中“name”是从 UI 传入的参数字符串。

【问题讨论】:

    标签: scala sorting


    【解决方案1】:

    应该这样做:

    scala> val alice = Person("Alice", None, 20)
    alice: Person = Person(Alice,None,20)
    
    scala> val bob = Person("Bob", None, 21)
    bob: Person = Person(Bob,None,21)
    
    scala> val charlie = Person("Charlie", None, 18)
    charlie: Person = Person(Charlie,None,18)
    
    scala> val persons = List(alice, bob, charlie)
    persons: List[Person] = List(Person(Alice,None,20), Person(Bob,None,21), Person(Charlie,None,18))
    
    scala> persons.sortBy(p => (p.age, p.name))
    res5: List[Person] = List(Person(Charlie,None,18), Person(Alice,None,20), Person(Bob,None,21))
    
    scala> persons.sortBy(p => (p.name, p.age))
    res6: List[Person] = List(Person(Alice,None,20), Person(Bob,None,21), Person(Charlie,None,18))
    

    要按参数动态排序,您可以根据作为输入传递的参数定义自己的排序函数。因此,您可以编写一个函数来返回一个传递给persons.sortBy 的函数。传入的函数是排序函数,例如sortByAge。如果您需要按两个或多个参数进行排序,也是同样的想法。

    scala> val sortByAge = (p :Person) => p.age
    sortByAge: Person => Integer = <function1>
    
    scala> persons.sortBy(sortByAge)
    res9: List[Person] = List(Person(Charlie,None,18), Person(Alice,None,20), Person(Bob,None,21))
    

    【讨论】:

    • 这不是我的意思,这部分我处理得很好。这是在您知道要排序的假设下。如果查询参数以 sortBy=age 的形式通过请求,那么我需要在 age 上进行排序,下一个请求可能是 sortBy=name。
    • @Colin 查看更新后的答案。 sortBy 采用一个函数进行排序,因此您可以根据作为输入的参数定义并传递您自己的函数。
    • @Brain,感谢您更新的答案。我希望我能做一些像我在更新的问题中所做的事情。那我就得做点不一样的了。谢谢,我会接受答案。
    【解决方案2】:

    case class Person(name: String, id: Int)
      def sort[T](list: List[T])(compare: (T, T) => Boolean): List[T] = {
        list.sortWith(compare)
      }
      
      
      val list = List(Person("P2", 1), Country("P1", 10))
        val rl = sort(list)((a, b) => a.name < b.name)

    这很简单

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 2017-07-12
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2010-10-31
      相关资源
      最近更新 更多