我想根据外部谓词对列表进行排序。我正在寻找具有表现力的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),以便编译器满意。这是糟糕的代码味道。任何人都可以提供替代方案来完成同样更优雅的事情吗?
答案 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,所以这会使所有元素保持相同的顺序。