目前我有一个案例类,其文本字段包含以下内容:
2 AT 30%
2 AT 40%
2 AT 50%
5 AT 30%
5 AT 40%
5 AT 50%
10 AT 30%
10 AT 40%
11 AT 30%
12 AT 30%
目前它们是无序的,因此5 AT将在2 AT之前等等..是否有一种简单的方法可以自然地订购它们或者我需要这样的东西:
object ExtraCostOrdering extends Ordering[[ExtraCost] {
override def compare(x: List[ExtraCost], y: List[ExtraCost]): Int = {
}
}
我该如何正确地做到这一点?
它应该自然地排序 2,3,4,5,6,7,8,9,10,11而不是11,12,2,3,4 大多数带有数字排序的文本字段都是错误的。
编辑:有时List可以包含没有任何数字的字符串
5 AT 50%
10 AT 30%
10 AT 40%
I'm a String
也有效。
答案 0 :(得分:2)
AFAIK自然排序顺序未内置于Scala中。但是,您可以通过转换为整数类型轻松地模拟它:
鉴于以下定义......
def asNatural(row: String) = row.split(" ").head.toInt
val myList = List("5 AT 30%","12 AT 30%", "2 AT 40%", "5 AT 50%", "5 AT 40%")
...您可以使用sortBy
进行自然排序。
scala> myList.sortBy(asNatural)
res2: List[String] = List(2 AT 40%, 5 AT 30%, 5 AT 50%, 5 AT 40%, 12 AT 30%)
当然,如果您有任何格式不正确的字符串,上述内容将会失败。以下内容稍微更“生产就绪”,并且会将所有格式错误的字符串放到最后:
import scala.util.Try
def asNatural(row: String) =
row.split(" ").headOption
.flatMap{ head => Try(head.toInt).toOption }
.getOrElse(Integer.MAX_VALUE)
答案 1 :(得分:-2)
由于您想要的订购是标准的,您可以执行以下操作:
val sorted: List[ExtraCost] = unsorted.sortWith((a,b) => a.textField > b.textField)