【问题标题】:Android SharedPreferences unsorted setAndroid SharedPreferences 未排序集
【发布时间】:2014-12-12 11:48:45
【问题描述】:

我想将字符串列表保存到 SharedPreferences 对象。我使用这些方法,但如果一组是 (2,1,3),当我阅读它时,列表是 (1,2,3)。我不想在读取数组时对集合进行排序。

编辑:当我使用 getSharedPreferences 时,该集合已经在 sharedPreferences 对象中排序。

private List<String> load() {
    Set<String> values = sharedPreferences.getStringSet(PREF_KEY, null);
    return new ArrayList<String>(values);
}

private void save(List<String> values) {
    //values = (2,1,3)
    Set<String> valuesSet = new HashSet<String>(values);
    //valuesSet = (1,2,3)
    sharedPreferences.edit()
            .putStringSet(PREF_KEY, valuesSet).commit();
}

【问题讨论】:

  • 阅读documentation of HashSet。 > 这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。 它不保证集合的迭代顺序;特别是,它不保证顺序会随着时间的推移保持不变。这个类允许空元素。
  • 我的问题是,当我执行 getSharedPreferences() 时,该集合在 sharedPreferences 对象中进行排序。
  • 您是否每次都得到排序值?检查重新运行应用程序 3-4 次并查看值。
  • 是的,我在调试时检查过。
  • 当您将 HashSet 添加到共享偏好时,您的订单将永远不会得到保证

标签: android arrays list set sharedpreferences


【解决方案1】:

使用序列化:

private void save(List<String> values) {
    String serialisedString = ObjectSerializer.serialize(values);

    sharedPreferences.edit()
            .putString(PREF_KEY, serialisedString).commit();
}


private List<String> load() {
    String serialisedString = sharedPreferences.getString(PREF_KEY, ObjectSerializer.serialize(new ArrayList<String>()));
    ArrayList<String> retrievedValues = (ArrayList<String>) ObjectSerializer.deserialize();

    return retrievedValues;    
}

【讨论】:

  • android中没有ObjectSerializer。
  • 找到它here
  • 或任何其他 json 库,如 org.json。
猜你喜欢
  • 2023-03-26
  • 2015-04-26
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多