自然/人类订购字符串(带字符串的案例类)

时间:2015-07-28 10:10:12

标签: scala

目前我有一个案例类,其文本字段包含以下内容:

    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

也有效。

2 个答案:

答案 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)