我正在尝试使用 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+" ");
}
输出:
bmw bmw_mnt bmw_sip bmw1
Scala 代码:
var list = List("bmw_sip", "bmw_mnt", "bmw1", "bmw")
list.sorted
输出:
List[String] = List(bmw, bmw1, bmw_mnt, bmw_sip)
最佳答案
Scala 在 sorted
上的 List[String]
实现最终使用 compareTo
定义的 java.lang.String
方法,该方法执行字典比较(如 doc 的详细解释)。'1'
和 '_'
的 Unicode values 分别为 49 和 95,实际上:
"_" compareTo "1"
// Int = 46
另一方面,C# 中的
Sort()
使用 Comparer<String>.Default
执行区域设置敏感的比较。您可以使用 Collator
在 Scala 中获得相同的结果: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)
和前面的例子有关
ord.compare("_", "1")
// Int = -1
请注意,这种排序方式取决于当前的语言环境(就像在原始 C# 代码中所做的那样)
为了完整起见,如果您想在 C# 中执行字典比较,则必须使用
StringComparer.Ordinal
:list.Sort(StringComparer.Ordinal);
关于c# - 在不改变 C# 顺序的情况下对等效于 C# 的 Scala 列表进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25361938/