java – 寻找字母顺序和自然顺序的组合(又名用户理智排序)

我认为这很容易找到premade,但似乎我在网上找到的任何解决方案只能解决部分问题.

我想对用户提供的文件名列表(文件大多以人和/或地址命名),有时用不同的语言(大多数是德语,有点法语和意大利语混合在一起),很少有任何其他西方语言).

我们的想法是以(德国)用户普遍认为理智的方式呈现此列表.这意味着顺序应该遵循Locale.GERMAN的java.text.Collat​​or,但同时期望是对字符串中的数字进行异常,因此“10”在“2”之后.

我找到了在网上进行自然排序的代码,但它依赖于逐字符比较(而Collat​​or不支持).我可以使用子字符串来破解某些内容,但在比较器内部,我认为在每次比较调用时创建多个子字符串并不是最明智的想法.

任何想法如何有效地实现这一点(在执行时间和实现时间),或者更好的是经过测试和随时可用的实现?

解决方法

如果你使用@millimoose建议的比较器(http://www.davekoelle.com/alphanum.html)修改它以通过Collat​​or
public class AlphanumComparator implements Comparator
{
private Collator collator;
public AlphanumComparator(Collator collator) {
    this.collator = collator;
}
.....
    public int compare(Object o1,Object o2)
    {
......
result = thisChunk.compareto(thatChunk); //should become
collator.compare(thisChuck,thatChuck);
....

这段代码似乎有问题,例如“01”更大,然后是“2”.但这取决于您的偏好,如果这很重要,请将其修改为在数字比较之前跳过前导零.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...