我认为这很容易找到premade,但似乎我在网上找到的任何解决方案只能解决部分问题.
我想对用户提供的文件名列表(文件大多以人和/或地址命名),有时用不同的语言(大多数是德语,有点法语和意大利语混合在一起),很少有任何其他西方语言).
我们的想法是以(德国)用户普遍认为理智的方式呈现此列表.这意味着顺序应该遵循Locale.GERMAN的java.text.Collator,但同时期望是对字符串中的数字进行异常,因此“10”在“2”之后.
我找到了在网上进行自然排序的代码,但它依赖于逐字符比较(而Collator不支持).我可以使用子字符串来破解某些内容,但在比较器内部,我认为在每次比较调用时创建多个子字符串并不是最明智的想法.
任何想法如何有效地实现这一点(在执行时间和实现时间),或者更好的是经过测试和随时可用的实现?
解决方法
如果你使用@millimoose建议的比较器(http://www.davekoelle.com/alphanum.html)修改它以通过Collator
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”.但这取决于您的偏好,如果这很重要,请将其修改为在数字比较之前跳过前导零.