【问题标题】:Consistent string sorting between Java and C#/.NETJava 和 C#/.NET 之间的一致字符串排序
【发布时间】:2018-05-14 07:57:38
【问题描述】:

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

确切的排序方式不是很重要,尽管按字母顺序和可能(德语)-区域设置依赖会很好。

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

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

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

更具体的语言环境/文化(如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)    ü

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

【问题讨论】:

  • 您可以在 .NET 中尝试 InvariantIgnoreCase - 值得一试
  • The consumer is a C#-application which uses the list for a binary search algorithm, so it has to use exactly the same ordering. 能否在 C# 端再次对数据进行排序以避免该问题?
  • 你的意思是InvariantCultureIgnoreCase?这对拉丁字母表中的元音变音(äöüß)进行排序,而 Java 将它们排序到最后。 - 行号用作其他数据结构中查找表的键,因此我可能不会在接收方更改它们的顺序。

标签: java c# sorting locale case-insensitive


【解决方案1】:

在 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);

【讨论】:

  • 这并没有回答我对比较器的要求,也没有解释它如何与任何 Java 实现相匹配。实现异常缓慢,并且没有解释temp.sort 如何处理不区分大小写。我不知道ListASCII.contains() 怎么可能在整个字符串上工作。 YourType 是什么?
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2011-12-06
  • 2012-07-18
  • 1970-01-01
相关资源
最近更新 更多