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

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

这是我现在得到的:

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

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

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

【问题讨论】:

标签: java unicode collation


【解决方案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”)给出的这种排序实际上在语法上是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2021-11-28
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多