使用数字对字符串进行排序的方式与一种语言不同.例如,英文数字在升序排序中位于字母之前.但是,在德语中,数字是在字母之后排序的.
我尝试使用Collator以下方法对字符串进行排序:
private Collator collator = Collator.getInstance(Locale.GERMANY);
collator.compare(str1, str2)
Run Code Online (Sandbox Code Playgroud)
但是上面的比较没有考虑字母后的数字规则.
有没有人知道为什么Java在我使用的时候没有考虑这个规则(字母后面的数字)RuleBasedCollator,如下所示:
private final String sortOrder = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R < s, S < t, T …Run Code Online (Sandbox Code Playgroud) 我有一组字符串,需要对它进行排序.我正在使用Collator.但输出很奇怪.
final Collator collator = Collator.getInstance(Locale.US);
List<String> data = new ArrayList<String>();
data.add("1Z5800701_AB");
data.add("1Z5800701_AC");
data.add("1Z5800701-A");
data.add("1Z5800701 A");
data.add("1Z5800701B");
data.add("1Z5800701A");
data.add("1Z5800701 - A");
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return collator.compare(o1, o2);
}
});
for (String s : data) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
1Z5800701_AB
1Z5800701_AC
1Z5800701A
1Z5800701 A
1Z5800701 - A
1Z5800701-A
1Z5800701B
Run Code Online (Sandbox Code Playgroud)
最后一个字符串'1Z5800701B'应该在'1Z5800701A'之后.我在这里错过了什么?
经过大量阅读和实验后,似乎我想要主要的搜索强度,但第三或相同的排序强度。主要问题:用 H2(或任何其他数据库)可以实现吗?
\n\n第二个问题:我是这里唯一的人吗?或者你们中有人也喜欢上述组合吗?一些确认会对我的理智有所帮助。
\n\n背景:\n似乎只能在创建数据库的一开始就设置排序规则。所以我想确保选择正确的一个。我主要考虑这些用例(目前):
\n\n用户可以开始输入内容来过滤表格的搜索字段:这里 PRIMARY 似乎是最合适的,以避免丢失任何结果(用户习惯于 Google...)。尽管如此,如果能够为用户提供启用二级或三级排序规则以进行更精确搜索的选项,那就太好了。
排序:当用户单击表列来对内容进行排序时,TERTIARY/IDENTICAL 排序似乎比较合适。这就是我从日常经验中习惯的。
我在这里阅读了官方 H2 文档: http: //www.h2database.com/html/commands.html#set_collat ion 。 \n在这里:http://www.h2database.com/html/datatypes.html#varchar_ignorecase_type \n更多相关信息:\n排序规则强度和本地语言关系
\n\n测试sql(来自https://groups.google.com/forum/?fromgroups=#!topic/h2-database/lBksrrcuGdY):
\n\ndrop all objects;\nset collation english STRENGTH PRIMARY;\ncreate table test(name varchar);\ninsert into test values (\'\xc3\x80\'), (\'\xc3\x84\'), (\'\xc3\x82\'), (\'A\'), (\'\xc3\xa0\'), (\'\xc3\xa4\'), (\'\xc3\xa2\'), (\'a\'), (\'\xc3\xa0a\'), (\'\xc3\xa4a\'), (\'\xc3\xa2a\'), (\'aa\'), (\'B\'), (\'b\');\nselect * from test where name like \'a\' order by name;\nselect * from test order by name;\nRun Code Online (Sandbox Code Playgroud)\n\n