如何设置排序器强度和分解以按首字母排序 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.Collator 它将把相似的字母视为不同的。
这是我现在得到的:
罗基什基斯 沙基艾 萨兰泰 Šeduva 希奥利艾 Šilalė 斯库达斯 陶拉格 Telšiai这就是我想要得到的(以 Š 开头的单词应该总是在 S 之后而不是第二个字母):
罗基什基斯 萨兰泰 斯库达斯 沙基艾 Šeduva 希奥利艾 Šilalė 陶拉格 Telšiai【问题讨论】:
所有 Java 字符串都是 Unicode 字符串。 ICU4J 不提供帮助吗? Java. Ignore accents when comparing strings的可能重复 【参考方案1】:我们可以创建一个扩展 Collator 的类并在那里重写 compare 方法。
这里有一个例子。
公共类 MyCollator 扩展了 Collator
@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列表进行排序,它会以正确的方式显示。
Collator collator = new MyCollator();
Collections.sort(list, collator);
我的测试结果如下:
罗基什基斯 萨兰泰 斯库达斯 陶拉格 Telšiai 沙基艾 Šeduva 希奥利艾 Šilalė注意,在结果中,Š显示在T之后,这是因为"Š".compareTo("T")>1 等于 true。
我相信你可以在比较方法中加入一些逻辑,让 Š 显示在 S 之后,T 之前。
以上代码使用JDK 1.5版本编译执行。
直接使用Collections.sort(list);您将得到与我上面提到的相同的结果。
【讨论】:
抱歉,我不想编写自己的 Collator 规则,因为根据文档 Java 6 Collator 支持这种语言的语言环境。所以我想知道如何以干净的方式解决这个问题。【参考方案2】:所以我测试了整理器强度和分解的所有变体,但没有任何改变。我发现通过我的语言环境(“lt_LT”)给出的这种排序实际上在语法上是正确的。
【讨论】:
以上是关于如何设置排序器强度和分解以按首字母排序 unicode 字符串的主要内容,如果未能解决你的问题,请参考以下文章