我有一个字符序列列表。我需要把它们按感觉自然的顺序排序。我在用Java编程。我最初的想法是使用Collections.sort()
。但我认为这种方法遵循ASCII顺序,将小写和大写文本分开。这不是一个自然的流程。
试图定义"自然排序",我做了一个快速搜索,发现NISO TR03-1999标准似乎解决了这个问题。
所以我想我需要一种方法来排序使用在该标准中定义的算法。Java中有这样的函数吗?或者我需要自己实现它吗?
有什么我没注意到的吗?
过去有人有过类似的问题吗?你是怎么处理的?
下面是测试Collections.sort()的代码示例:List<String> list = new ArrayList<String>();
list.add("z");
list.add("a");
list.add("Z");
list.add("A");
list.add("z 1");
list.add("a 1");
list.add("Z 1");
list.add("A 1");
list.add(" space");
list.add("!");
list.add(".");
list.add(";");
list.add("\");
list.add("/");
list.add("+");
list.add("1");
list.add("2");
list.add("10");
list.add("1abc");
list.add("2abc");
list.add("10abc");
Collections.sort(list);
for (String string : list)
System.out.println(string);
看一下排序器。这里的文档:https://docs.oracle.com/javase/8/docs/api/java/text/Collator.html
您可以创建自己的比较器类来比较并忽略大小写。
static class StringCompare implements Comparator<String> {
public int compare(String s1, String s2){
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
}
然后用这个排序:
Collections.sort(list, new StringCompare());
在比较器实现中使用apache通用的StringUtils:
class StringCompare implements Comparator<String> {
public int compare(String s1, String s2){
return StringUtils.stripAccents(s1.toLowerCase()).compareTo(StringUtils.stripAccents(s2.toLowerCase()));
}
}