使用比较器排序不起作用

Sorting with Comparator not working

我必须按照以下格式存储和管理卷列表: "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();

}

改用 Integer.valueOf() 方法 Integer.parceInt()

我建议您只存储值“100”、“1000”、“300”和 UNIT(如果您有多个可用单位)。

所以,您可以只使用普通的整数比较器对其进行排序,然后在运行时应用 "ml" 后缀

尝试使用此代码对数组列表进行升序排序。

 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));
            }
        });