使用比较器进行排序不起作用

时间:2015-09-07 19:33:30

标签: android sorting comparator

我必须以以下格式存储和管理卷列表: " 100毫升"," 200毫升"," 300毫升" ...

每次更改列表时,我都会使用带有JSON的SharedPreferences来存储它。

我希望订购列表,所以100< 1000,但它在300之前显示为1000和2000。

这是我的比较器:

mVolumeComparator = new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {

            int volume1 = Integer.parseInt(s1.replace(" ml", ""));
            int volume2 = Integer.parseInt(s2.replace(" ml", ""));

            if (volume1 > volume2) {
                return 1;
            } else if (volume2 > volume1) {
                return -1;
            } else {
                return 0;
            }
        }
    };

这是我的获取方法:

public static ArrayList<String> getVolumesFromPreference(Context ctx) {

    if (!ctx.getSharedPreferences(KEY_SHARED_PREFERENCES, MODE_PRIVATE).contains(KEY_VOLUMES_BUNDLE)) {

        startDefaultVolumes(ctx, KEY_VOLUMES_BUNDLE);

    }

    try {
        JSONArray jsonArray = new JSONArray(ctx.getSharedPreferences(KEY_SHARED_PREFERENCES, MODE_PRIVATE).getString(KEY_VOLUMES_BUNDLE, null));
        ArrayList<String> lista = new ArrayList<>();

        for (int i = 0; i < jsonArray.length(); i++) {
            lista.add(jsonArray.getString(i));
        }

        Collections.sort(lista, mVolumeComparator);

        return lista;
    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }


}

 private static void startDefaultVolumes(Context ctx, String key_bundle) {

    JSONArray jsonArray = new JSONArray();
    jsonArray.put("269 ml");
    jsonArray.put("350 ml");
    jsonArray.put("473 ml");
    jsonArray.put("550 ml");
    jsonArray.put("600 ml");

    SharedPreferences.Editor editor = ctx.getSharedPreferences(KEY_SHARED_PREFERENCES, MODE_PRIVATE).edit();
    editor.putString(key_bundle, jsonArray.toString());
    editor.commit();

}

Volumes Lib

3 个答案:

答案 0 :(得分:2)

使用Integer.valueOf()方法代替Integer.parceInt()

答案 1 :(得分:1)

如果您有超过单位可用,我建议您只存储值“100”,“1000”,“300”和UNIT。

所以,您只需使用普通的Integer比较器进行排序,然后在运行时应用“ml”后缀

答案 2 :(得分:0)

尝试使用此代码按升序对arraylist进行排序。

 ArrayList<int> lista = new ArrayList<>();

        for (int i = 0; i < jsonArray.length(); i++) {
            lista.add(Integer.parseInt(jsonArray.getString(i)));
        }

 Collections.sort(lista , new Comparator<Integer >() {
            @Override
            public int compare(Integer lhs, Integer rhs) {
                return Integer.valueOf(lhs).compareTo(Integer.valueOf(rhs));
            }
        });