您好,我需要对包含以下类型数据的数组列表进行排序:
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)
我做错了什么?我正在做的方式是错的还是有其他方法来实现它!提前谢谢!
答案 0 :(得分:4)
这是因为这些数字(1,10,2)被视为字符串。
所以你会得到这些订单
name1
name10
name2
你想要的是自然分类,请看
Natural sort order string comparison in Java - is one built in?
答案 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