我正在尝试使用scala中的字符串集合对列表进行排序,其结果应与C#列表结果相同.但是对于以下数据,C#以不同的顺序返回结果,scala以不同的顺序返回结果.任何人都可以告诉我,对于任何类型的字符串,两种语言的结果都是谁?
C#代码:
List<String> list = new List<String>();
list.Add("bmw_sip");
list.Add("bmw_mnt");
list.Add("bmw1");
list.Add("bmw");
list.Sort();
foreach (String data in list)
{
Console.Write(data+" ");
}
Run Code Online (Sandbox Code Playgroud)
输出:
bmw bmw_mnt bmw_sip bmw1
Run Code Online (Sandbox Code Playgroud)
Scala代码:
var list = List("bmw_sip", "bmw_mnt", "bmw1", "bmw")
list.sorted
Run Code Online (Sandbox Code Playgroud)
输出:
List[String] = List(bmw, bmw1, bmw_mnt, bmw_sip)
Run Code Online (Sandbox Code Playgroud)
Scala的实施sorted上的List[String]最终使用compareTo由定义的方法java.lang.String,其执行一个词典比较(如由在细节解释DOC).
事实上,和的Unicode值分别为49和95:'1''_'
"_" compareTo "1"
// Int = 46
Run Code Online (Sandbox Code Playgroud)
另一方面,Sort()在C#用途Comparer<String>.Default中执行区域敏感的比较.您可以使用以下命令在scala中获得相同的结果Collator:
val ord = Ordering.comparatorToOrdering(java.text.Collator.getInstance)
List("bmw_sip", "bmw_mnt", "bmw1", "bmw").sorted(ord)
// List[String] = List(bmw, bmw_mnt, bmw_sip, bmw1)
Run Code Online (Sandbox Code Playgroud)
并且只是与前面的例子有关
ord.compare("_", "1")
// Int = -1
Run Code Online (Sandbox Code Playgroud)
请注意,这种排序取决于当前的语言环境(就像它在原始C#代码中所做的那样)
为了完整起见,如果您想在C#中执行字典比较,则必须使用StringComparer.Ordinal:
list.Sort(StringComparer.Ordinal);
Run Code Online (Sandbox Code Playgroud)