我有一个Java程序,它会发出一个街道名称列表。名称应按不区分大小写排序。使用者是一个C#应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序。
确切的排序方式并不是很重要,尽管按字母顺序排列并且可能(德语)-locale依赖会很好。
我在两个平台之间找不到一对匹配的“不区分大小写的字符串比较器对象”。到目前为止我得到的最好结果是:
String.CASE_INSENSITIVE_ORDER
StringComparer.OrdinalIgnoreCase
但他们不同意'ü'和'ß'的比较(见注1)。
更具体的语言环境/文化(如DE-de
)在处理空格和特殊字符方面有所不同。
我可以为Java和.NET选择哪一对不区分大小写的Comparers / Orders / Collators,它们同意每个给定的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 'ß',所以没有实现使用它 - 它不能解决上面的问题。
答案 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);