微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不改变C#顺序的情况下对scala列表进行排序等效于C#

我正在尝试使用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在List [String]上排序的实现最终使用java.lang.String定义的compareto方法,该方法执行字典比较(如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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐