为什么我的ArrayList <string>没有正确排序?</string>

时间:2014-10-05 16:57:38

标签: android sorting arraylist android-sqlite comparator

我一直在网上搜索并尝试,但我找不到解决方案。

我有以下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

有人可以指导我如何实现这个目标吗?

非常感谢

编辑:

我忘了提及我让用户自由命名他们的类别名称。

3 个答案:

答案 0 :(得分:4)

lexicographical order排序。 如果你想要它那样排序,你应该切换到使用两位数,

例如。 Cate01Cate02,...

请注意,这也发生在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”?你最终如何解决这个问题取决于你想要使用...的值...