我目前正在尝试根据单词“ Item”后找到的数字来订购ArrayListString个元素(称为myarraylist)。以下是myarraylist中的代码片段:

Item 1
Item 2
Item 3
...
Item 9
Item 10


我想按以下顺序订购myarraylist

Item 10
Item 9
Item 8
...
Item 3
Item 2
Item 1


到目前为止,这是我尝试过的:

    Collections.sort(myarraylist, String.CASE_INSENSITIVE_ORDER);
    Collections.reverse(myarraylist);


但是,这按以下顺序对myarraylist进行排序

Item 9
Item 8
...
Item 3
Item 2
Item 10
Item 1


如您所见,Item 10不合适,因为它的第一个数字“ 1”读为“ 10”。有谁知道如何正确地按反数字顺序排列myarraylist

最佳答案

这是因为默认的字符串Comparator使用lexicographical order-即像字典一样逐个字符。由于“ 1”在“ 2”之前,因此任何以“ 1”开头的字符串都将在其他以“ 2”开头的字符串之前。

您应该使用自定义比较器来实现Natural Sorting。一个很好的例子是Dave Koelle的Alphanum,您可以这样使用:

Collections.sort(myarraylist, new AlphanumComparator());

09-12 10:30