我正在尝试使用 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/

10-14 22:07
查看更多