在Java和C#/ .NET之间进行一致的字符串排序

时间:2017-11-30 11:38:48

标签: java c# sorting locale case-insensitive

我有一个Java程序,它会发出一个街道名称列表。名称应按不区分大小写排序。使用者是一个C#应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序。

确切的排序方式并不是很重要,尽管按字母顺序排列并且可能(德语)-locale依赖会很好。

我在两个平台之间找不到一对匹配的“不区分大小写的字符串比较器对象”。到目前为止我得到的最好结果是:

  • java:String.CASE_INSENSITIVE_ORDER
  • .NET:StringComparer.OrdinalIgnoreCase

但他们不同意'ü'和'ß'的比较(见注1)。

更具体的语言环境/文化(如DE-de)在处理空格和特殊字符方面有所不同。

我可以为Java和.NET选择哪一对不区分大小写的Comparers / Orders / Collat​​ors,它们同意每个给定的Unicode字符串?

(toLower / toUpper不是一个选项,原因有几个)

注1: 我假设Java在比较序数值之前执行toLower,而C#执行toUpper:

U+00C4  LATIN CAPITAL LETTER A WITH DIAERESIS (U+00C4)  Ä
U+00D6  LATIN CAPITAL LETTER O WITH DIAERESIS (U+00D6)  Ö
U+00DC  LATIN CAPITAL LETTER U WITH DIAERESIS (U+00DC)  Ü

U+00DF  LATIN SMALL LETTER SHARP S (U+00DF)     ß

U+00E4  LATIN SMALL LETTER A WITH DIAERESIS (U+00E4)    ä
U+00F6  LATIN SMALL LETTER O WITH DIAERESIS (U+00F6)    ö
U+00FC  LATIN SMALL LETTER U WITH DIAERESIS (U+00FC)    ü

直到最近还没有capital letter for 'ß',所以没有实现使用它 - 它不能解决上面的问题。

1 个答案:

答案 0 :(得分:0)

在c#侧编写自己的函数,遍历每个字母。 if它是一个ASCII字符,然后放在它的有序位置的ASCII子列表中。 if这是一封德语字母(我很确定它们有一个集合)将它们放在UTF子列表中。这导致定义的顺序(ASCII的第一个,äößü...第二个)。 要做到这一点:

List<YourType> temp = new List<YourType>();
int ASCIIcounter = 0;
int UTFcounter = 0;

foreach(YourType inc in yourList)
{
    if (ListASCII.contains(inc.yourSringData))
    { 
        temp.insert(inc, ASCIIcounter); ASCIIcounter++; UTFcounter++;
    }
    else 
    { 
         temp.insert(inc, UTFcounter); UTFcounter++; 
    }
}
temp.sort(0, ASCIIcoutner, null);
temp.sort(ASCIIcounter + 1, UTFcounter, null);