带有字母数字字符串的Java排序对象arraylist

时间:2017-06-14 22:47:15

标签: java sorting arraylist comparator

您好,我需要对包含以下类型数据的数组列表进行排序:

 name1 1111 1622 122ks
 name3 1211 4122 1aks
 name2 1113 1322 12sks
 name10 2111 1222 12dks
 ...
 name4 asd1 2334 asd8

有一个简单的Model类来填充日期!现在我要做的是比较名称的基础,即name1与name2比较,依此类推。为此,我这样做:

  public class ABC implements Comparator<MyModel> {
    @Override
    public int compare(MyModel o1, MyModel o2) {
    return o1.name.compareTo(o2.name);
   }
 }    

它根据我的要求提供输出!但是当名字超过10时我的名字在10 11 12之后我的比较器不会给我所需的排序列表,输出变为:

    name1 1111 1622 122ks
    name10 1211 4122 1aks
    name11 1113 1322 12sks
    name12 2111 1222 12dks
    ...
    name2 asd1 2334 asd8
    ... (sorted so on)

我做错了什么?我正在做的方式是错的还是有其他方法来实现它!提前谢谢!

2 个答案:

答案 0 :(得分:4)

这是因为这些数字(1,10,2)被视为字符串。 所以你会得到这些订单 name1 name10 name2

你想要的是自然分类,请看

Natural sort order string comparison in Java - is one built in?

Java String Number Comparator

示例:https://repl.it/ImA2/1

答案 1 :(得分:1)

如果name不变,您可以在substring中使用comparator来比较之后的数字。例如:

public class ABC implements Comparator<MyModel> {
    @Override
    public int compare(MyModel o1, MyModel o2) {
    return Integer.parseInt(o1.name.substring(4))-Integer.parseInt(o2.name.substring(4));
   }
 }

修改

如果name不是常量,您可以首先遍历该名称以查找第一个数字并将索引保​​存到该索引的substring