我一直在网上搜索并尝试,但我找不到解决方案。
我有以下ArrayList:
{Cate1,Cate3,Cate6,Cate2,....,通过Cate10}
我尝试了以下解决方案:
public ArrayList<String> GetAllCategories_ByAscOrder() {
db = getWritableDatabase();
ArrayList<String> Category_ArrayList = new ArrayList<String>();
Cursor cursor = db.query(Category_TABLE, null, null, null, null, null, Category_List + " ASC");
if(cursor != null)
{
while(cursor.moveToNext())
{
String CATEGORY = cursor.getString(cursor.getColumnIndex(Category_List));
Category_ArrayList.add(CATEGORY);
}
}
cursor.close();
return Category_ArrayList;
}
这些:
Collections.sort(CATEGORY_LIST, new Comparator<String>(){
public int compare(String obj1, String obj2)
{
return obj1.compareToIgnoreCase(obj2);
}
});
}
//OR THIS:
Collections.sort(CATEGORY_LIST, new Comparator<String>(){
public int compare(String obj1, String obj2)
{
return obj1.compareTo(obj2);
}
});
}
//OR THIS:
Collections.sort(CATEGORY_LIST, String.CASE_INSENSITIVE_ORDER);
但他们所有人都给了我相同的排序结果: Cate1,Cart10,Cate2,Cate3等...... Cate9
我希望排序列表如下:
Cate1至Cate10
有人可以指导我如何实现这个目标吗?
非常感谢
编辑:
我忘了提及我让用户自由命名他们的类别名称。
答案 0 :(得分:4)
按lexicographical order排序。 如果你想要它那样排序,你应该切换到使用两位数,
例如。 Cate01
,Cate02
,...
请注意,这也发生在Windows / Linux文件系统中(如果文件夹中有编号的文件)。
答案 1 :(得分:4)
这样做:
Collections.sort(list , new Comparator<String>(){
public int compare( String a, String b ){
// if contains number
if( a.substring(4).matches("\\d+") && b.substring(4).matches("\\d+")) {
return new Integer( a.substring(4) ) - new Integer( b.substring(4) );
}
// else, compare normally.
return a.compareTo( b );
}
});
答案 2 :(得分:3)
从技术上讲,你得到的结果是正确的 - Cart10按字母顺序排在Cart2之前(因为1来自2之前)。
尝试在排序之前将前导0添加到您的号码中:Cart01,Cart02等 - 尽管您需要使用前导零填充以确保覆盖您希望列表获得的最大值(如果它将超过100)元素,你需要更多的零)。
或者,为什么不将它存储为ArrayList<Integer>
并在输出结果时添加“Cart”?你最终如何解决这个问题取决于你想要使用...的值...