5

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

这就是我现在得到的:

  • 罗基什基斯
  • 沙基艾
  • 萨兰泰
  • 舍杜瓦
  • 希奥利艾
  • 希拉莱
  • 斯库达斯
  • 陶拉格
  • 泰尔希艾

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

  • 罗基什基斯
  • 萨兰泰
  • 斯库达斯
  • 沙基艾
  • 舍杜瓦
  • 希奥利艾
  • 希拉莱
  • 陶拉格
  • 泰尔希艾
4

2 回答 2

1

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

一个例子是here。

公共类 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列表进行排序,它会以正确的方式显示。

整理者整理者 = new MyCollat​​or();

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

我的测试结果如下:

  • 罗基什基斯
  • 萨兰泰
  • 斯库达斯
  • 陶拉格
  • 泰尔希艾
  • 沙基艾
  • 舍杜瓦
  • 希奥利艾
  • 希拉莱

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

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

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

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

于 2013-10-28T10:00:27.023 回答
0

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

于 2013-11-07T08:20:14.483 回答