用于排序的部分函数值

时间:2016-08-04 18:56:11

标签: scala

我想根据外部谓词对列表进行排序。我正在寻找具有表现力的Scala替代品。对于我提出的两种选择,我并不是很疯狂。给出:

val lst = List(5,4,3,2,1)
val needsSorting = false

我希望能够像这样写一个简洁的排序表达式:

lst.sortBy(sortDecision)

给我列出按升序排序的列表:

List(1,2,3,4,5) // if needSorting == true

或按原始时间顺序

List(5,4,3,2,1) // if needSorting == false

但我希望决定如何将其排序嵌入我的sortDecision部分功能中。我想出的是两种选择:

备选方案1:

val sortDecision: PartialFunction[Int,Int] = {
    case x: Int if (needsSorting) =>  x 
    case _ => -1
}

备选方案2:

val sortDecision: PartialFunction[Int,Int] = {
    case x: Int =>  if (needsSorting) x else -1
}

但在这两种情况下我都有!needsSorting案例必须产生一些填充(在这种情况下为-1),以便编译器满意。这是糟糕的代码味道。任何人都可以提供替代方案来完成同样更优雅的事情吗?

1 个答案:

答案 0 :(得分:1)

我认为更优雅的方式是在Element='<td class="col-xs-0"> <input type="radio" ng-click="selectedRun(record.file_name, record.run_status);" /> </td>' Element='<td class="col-xs-0"> <input type="radio" ng-click="selectedRun(record.file_name, record.run_status);" /> </td>' 时根本不排序,因为我认为这是你的意图完全清楚的唯一方式。

实现这一目标的另一种方法是提供needsSorting == false,但如果你想在{{{{}}内做出决定,你最终必须做类似的事情(例如比较虚拟值)。 1}}。

您可能已经知道返回Ordering使列表未排序的原因是sortBy将每个Ordering转换为另一个值,然后在比较时使用该值。因此,在您的示例中,它就像排序-1然后放回原始值一样。因为scala排序是stable,所以这会使所有元素保持相同的顺序。