如何设置排序器强度和分解以按首字母排序 unicode 字符串

Posted

技术标签:

【中文标题】如何设置排序器强度和分解以按首字母排序 unicode 字符串【英文标题】:How to set up collators strength and decomposition for sorting unicode string by first letter 【发布时间】:2013-11-06 22:34:35 【问题描述】:

我有一个要按首字母排序的 unicode 字符串列表。问题是我不知道设置 java.text.Collat​​or 它将把相似的字母视为不同的。

这是我现在得到的:

罗基什基斯 沙基艾 萨兰泰 Šeduva 希奥利艾 Šilalė 斯库达斯 陶拉格 Telšiai

这就是我想要得到的(以 Š 开头的单词应该总是在 S 之后而不是第二个字母):

罗基什基斯 萨兰泰 斯库达斯 沙基艾 Šeduva 希奥利艾 Šilalė 陶拉格 Telšiai

【问题讨论】:

所有 Java 字符串都是 Unicode 字符串。 ICU4J 不提供帮助吗? Java. Ignore accents when comparing strings的可能重复 【参考方案1】:

我们可以创建一个扩展 Collat​​or 的类并在那里重写 compare 方法。

这里有一个例子。

公共类 MyCollat​​or 扩展了 Collat​​or

@Override
public int compare(String source, String target) 
    return source.compareTo(target);


@Override
public CollationKey getCollationKey(String source) 
    // TODO Auto-generated method stub
    return null;


@Override
public int hashCode() 
    // TODO Auto-generated method stub
    return 0;

然后我们可以使用这个新添加的类对String列表进行排序,它会以正确的方式显示。

Collat​​or collat​​or = new MyCollat​​or();

Collections.sort(list, collat​​or);

我的测试结果如下:

罗基什基斯 萨兰泰 斯库达斯 陶拉格 Telšiai 沙基艾 Šeduva 希奥利艾 Šilalė

注意,在结果中,Š显示在T之后,这是因为"Š".compareTo("T")>1 等于 true。

我相信你可以在比较方法中加入一些逻辑,让 Š 显示在 S 之后,T 之前。

以上代码使用JDK 1.5版本编译执行。

直接使用Collections.sort(list);您将得到与我上面提到的相同的结果。

【讨论】:

抱歉,我不想编写自己的 Collat​​or 规则,因为根据文档 Java 6 Collat​​or 支持这种语言的语言环境。所以我想知道如何以干净的方式解决这个问题。【参考方案2】:

所以我测试了整理器强度和分解的所有变体,但没有任何改变。我发现通过我的语言环境(“lt_LT”)给出的这种排序实际上在语法上是正确的。

【讨论】:

以上是关于如何设置排序器强度和分解以按首字母排序 unicode 字符串的主要内容,如果未能解决你的问题,请参考以下文章

Java编程实现中英混合字符串数组按首字母排序的方法

JAVA通过数组按首字母排序

按首字母 Javascript 按字母顺序对对象进行排序和分组

按首字母分组排序数组

如何将 axlsx 文件分组以按 org 字母顺序排序

如何比较包含非英文字符的 unicode 字符串以按字母顺序排序?