Scala 自然/人工排序字符串(带字符串的案例类)
目前我有一个case类,它有一个文本字段,包含以下内容:Scala 自然/人工排序字符串(带字符串的案例类),scala,Scala,目前我有一个case类,它有一个文本字段,包含以下内容: 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
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
大多数带有数字排序的文本字段都是错误的
编辑:有时列表可能包含没有任何数字的字符串,所以
5 AT 50%
10 AT 30%
10 AT 40%
I'm a String
也是有效的。因为您想要的订购是标准的,所以您可以执行以下操作:
val sorted: List[ExtraCost] = unsorted.sortWith((a,b) => a.textField > b.textField)
当然,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)
这不是一个自然的排序顺序。只要我的列表[String]没有与根本不包含任何数字的字符串混合,就可以这样做。有时,我发现列表也可能包含一个普通字符串。但您的解决方案仍然是greatThanks-我添加了一些错误处理示例。虽然你可能会更好地完全过滤掉格式不好的行。感谢所有这些,在其他语言中,我有一个正则表达式,这真的很奇怪,但你的解决方案很棒,速度也很快,不过我将列表拆分,这样我就不需要你的“格式不好”解决方案了,谢谢,但是,如果百分比值也需要自然排序顺序(即:5%或100%是可能的),最简单的方法是使用正则表达式将字符串中的所有数字提取到整数元组中,然后在此基础上进行排序。