SharedPreferences 字符串设置为数组顺序问题

SharedPreference StringSet to Array Order Issue

请耐心等待我解释我的问题:

1) 我通过 StringSet 存储我的首选项,如下所示:

      SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();

            // Create a new Arraylist with the details of our details
            ArrayList <String> newCityFareDetails = new ArrayList<String>();

            // Store various values
            newCityFareDetails.add(0, String.valueOf(cloneFare.value1()));
            newCityFareDetails.add(1, String.valueOf(cloneFare.value2()));
            newCityFareDetails.add(2, String.valueOf(cloneFare.value3()));
            newCityFareDetails.add(3, String.valueOf(cloneFare.value4()));
            newCityFareDetails.add(4, cloneFare.value5());

            // Only value 5 is a string, rest are all floats


            // Convert to a hashstring, give it the name of our value
            Set<String> set = new HashSet<String>();
            set.addAll(newCityFareDetails);
            editor.putStringSet(extras.getString("startCity"), set);

            // And write it to storage
            editor.commit();

现在,我试着按如下方式阅读它:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE);

Set<String> tryCityFromPrefs = prefs.getStringSet(currentCity, null);

 if (tryCityFromPrefs!=null){


                        // Crude code, but we convert the preferences into a String array
                        String[] values = tryCityFromPrefs.toArray(new String[tryCityFromPrefs.size()]);

                        myFare = new Fare(Float.parseFloat(values[0]), Float.parseFloat(values[1]),
                                Float.parseFloat(values[2]), Float.parseFloat(values[3]), values[4]);

                    }

现在,问题是 myFare 没有正确初始化,因为数组中的值被打乱了。即,我们保存时位于最后位置的字符串值现在位于第二位。这与 Sets 到 String 的转换有关吗?还是我遗漏了一些明显的东西?

A Set 不保证顺序。虽然有特定的 Set 实现(例如,LinkedHashSet)被订购,但这不是 SharedPreferences 使用的。

您的选择是:

  1. 将您的应用更改为不关心顺序。

  2. 以其他方式保存 SharedPreferences 中的数据。例如,在 this app 中,我使用 JsonReader/JsonWriterArrayList 保存为单个 String 值。

  3. 以其他方式保存数据(例如,JSON 文件,使用序列号维护顺序的 SQLite 数据库)。