如何通过java中的输入顺序从共享首选项保存和检索数据?
当我在共享偏好中保存此类数据时
HashMap<Integer, String> likes = new HashMap<Integer, String>();
// THIS IS INPUT ORDER
likes.put(1,"a")
likes.put(2,"b")
likes.put(3,"c")
likes.put(4,"d")
editor = getSharedPreferences("PREFS_NAM", 0).edit();
for (Map.Entry<Integer, String> entry : likes.entrySet())
editor.putString(String.valueOf((entry.getKey())),
entry.getValue());
editor.apply();
当我找回它时
SharedPreferences prefs = getSharedPreferences("PREFS_NAM", 0);
for (Map.Entry entry : prefs.getAll().entrySet())
likes.put(Integer.valueOf(entry.getKey().toString()),
entry.getValue().toString());
看起来像
(1,"a")
(2,"b")
(4,"d")
(3,"c")
哪个输入顺序不一样!
答案 0 :(得分:1)
尝试以下方法
Map<Integer, String> likes = new LinkedHashMap<Integer, String>();
LinkedHashMap 旨在将密钥,值和条目按其放入的顺序保存。
答案 1 :(得分:0)
SharedPreferences
用于存储和检索简单数据,即使是稍微复杂的结构也使用它们相当尴尬。
您似乎试图存储和检索Map
,并且您希望迭代顺序为插入顺序。首先,您应该使用LinkedHashMap
而不是普通的HashMap
,因为后者不会对迭代顺序做出任何保证。
Map<Integer, String> likes = new LinkedHashMap<>();
但是,当您从SharedPreferences
获取数据时,这并不意味着保留订单。
您可以使用密钥"K0"
,"K1"
,"K2"
...来修复此问题,以存储地图的密钥和密钥"V0"
,"V1"
,{ {1}} ...存储地图的值。像这样的东西可以工作(未经测试):
"V2"
然后检索:
int index = 0;
for (Map.Entry<Integer, String> e : likes.entrySet()) {
editor.putInt("K" + index, e.getKey());;
editor.putString("V" + index, e.getValue());
index++;
}
这显然很可怕,Map<Integer, String> likes = new LinkedHashMap<>();
Map<String, ?> all = prefs.getAll();
for (int i = 0; i < all.size() / 2; i++)
likes.put((Integer) all.get("K" + i), (String) all.get("V" + i));
并非真的为此设计,但它确实有用。