Java和C#/.NET之间的一致字符串排序
我有一个Java程序,它发出一个街道名称列表。名称应不区分大小写排序。消费者是一个C#应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序 确切的排序并不十分重要,尽管按字母顺序排序,或者根据(德语)语言环境排序会更好 我未能在两个平台之间找到一对匹配的“不区分大小写的字符串比较器对象”。到目前为止,我得到的最好结果是:Java和C#/.NET之间的一致字符串排序,java,c#,sorting,locale,case-insensitive,Java,C#,Sorting,Locale,Case Insensitive,我有一个Java程序,它发出一个街道名称列表。名称应不区分大小写排序。消费者是一个C#应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序 确切的排序并不十分重要,尽管按字母顺序排序,或者根据(德语)语言环境排序会更好 我未能在两个平台之间找到一对匹配的“不区分大小写的字符串比较器对象”。到目前为止,我得到的最好结果是: java:String.不区分大小写\u顺序 .NET:StringComparer.OrdinalIgnoreCase 但他们对“ü”和“ß”的比较持不同
- java:
String.不区分大小写\u顺序
- .NET:
StringComparer.OrdinalIgnoreCase
DE DE
)在处理空格和特殊字符方面有所不同
我可以为Java和.NET选择哪一对不区分大小写的比较器/命令/排序器,它们适用于每个给定的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) ü
直到最近还没有,所以还没有实现使用它——而且它也不能解决上述问题。在c端编写自己的函数,这贯穿了每个字母<代码>如果它是ASCII字符,则将其按顺序放置在ASCII字符的子列表中<代码>如果它是一个德文字母(我很确定有一个集合),请将其放入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);
List temp=new List();
int ascicounter=0;
int UTFcounter=0;
foreach(列表中的YourType inc)
{
if(listscii.contains(inc.yourSringData))
{
临时插入(inc,ASCICounter);ASCICounter++;UTFcounter++;
}
其他的
{
温度插入(inc,UTFcounter);UTFcounter++;
}
}
临时排序(0,ASCIIcoutner,null);
临时排序(ASCICounter+1,UTFcounter,null);
在c#端编写自己的函数,它贯穿每个字母<代码>如果它是ASCII字符,则将其按顺序放置在ASCII字符的子列表中<代码>如果它是一个德文字母(我很确定有一个集合),请将其放入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);
List temp=new List();
int ascicounter=0;
int UTFcounter=0;
foreach(列表中的YourType inc)
{
if(listscii.contains(inc.yourSringData))
{
临时插入(inc,ASCICounter);ASCICounter++;UTFcounter++;
}
其他的
{
温度插入(inc,UTFcounter);UTFcounter++;
}
}
临时排序(0,ASCIIcoutner,null);
临时排序(ASCICounter+1,UTFcounter,null);
你可以在.NET-worth中尝试InvariantIgnoreCase
消费者是一个C应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序。你能在C端再次对数据排序以避免问题吗?你是说InvariantCultureIgnoreCase
?这将在拉丁字母表中对Umlauts(äöüß)进行排序,而Java将它们排序到末尾。-行号用作在其他数据结构中查找表的键,因此我可能不会在接收器端更改它们的顺序。您可以尝试在.NET-worth中使用InvariantIgnoreCase
go消费者是一个C应用程序,它使用列表进行二进制搜索算法,因此,它必须使用完全相同的顺序。
您能在C端对数据再次排序以避免问题吗?您的意思是不变量文化识别码
?这将在拉丁字母表中对Umlauts(äöüß)进行排序,而Java将它们排序到末尾。-行号用作在其他数据结构中查找表的键,因此我可能不会在接收方更改它们的顺序。这并没有回答我对比较器的请求,也没有解释它如何与任何Java实现匹配。该实现异常缓慢,并且没有解释temp.sort
如何处理大小写不敏感。我不知道listscii.contains()
如何处理整个字符串。什么是YourType
?这并没有回答我对比较器的要求,也没有解释它如何匹配任何Java实现。该实现异常缓慢,并且没有解释temp.sort
如何处理大小写不敏感。我不知道listscii.contains()
如何处理整个字符串。你的类型是什么?