【问题标题】:android SharedPreferences putStringSet order/sortandroid SharedPreferences putStringSet 顺序/排序
【发布时间】:2023-03-26 07:55:02
【问题描述】:

我尝试保存/恢复一组字符串,除一件事外,一切正常。 当我创建我的字符串时,我放了:

Set<String> set = new HashSet<String>();
for(int i=0; i<toggles.size();i++){
   set.add(toggles.get(i).serialise());                 
}

顺序例如是“蓝牙”“应用程序”“数据”。 当我回来的时候:

Set<String> set = prefs.getStringSet(key, new HashSet<String>());
for (String toggle : set){
    Toggle t = new Toggle();
    t.deserialize(toggle);
    toggles.add(t); 
}

我得到“应用程序”“蓝牙”“数据”,它们是按名称排序的,我不想要这个。 我想获得与我保存的相同的订单。 任何人都可以帮助我吗?

【问题讨论】:

  • 我知道这不是您要寻找的答案,但您真的需要 SharedPrefs 吗?也许静态列表或数据库会更容易?

标签: android save sharedpreferences


【解决方案1】:

这是不可能的。集合是无序的集合。

【讨论】:

  • @Squonk:没用。 SharedPreferences 在读回它们时将使用HashSet
  • 啊,好的。我自己从未尝试过,所以我不确定。了解有用。
  • “这是不可能的”,你的意思是回读集不可能被重新排序(因此提问者一定是错误的),还是你的意思是不可能是否按照与写入相同的顺序回读?
  • @DDSports:正确。如果数组不太长,您可以考虑将它们连接在一起,使用不会在单个字符串中使用的分隔符(例如,|)并将它们保存为单个 String。然后,您可以在重新阅读它们时将它们分开split()
  • @Lion789: SharedPreferences 支持Set&lt;String&gt;,这是无序的。如果您想要其他任何东西,请使用其他数据存储或按照我以前的 cmets 进行自己的编组。
【解决方案2】:

您可以为字符串添加前缀,例如00application01bluetooth02data,按照您想要的顺序排列。将getStringSet返回的Set&lt;String&gt;放入Array&lt;Set&gt;中并排序。

Set<String> set = prefs.getStringSet(key, new HashSet<String>());
Array<String> a = set.toArray();
java.util.Arrays.sort(a);

【讨论】:

  • 谢谢 :) 我将序列化对象放在 set 下,所以我在该对象下放置了一个字段“位置”,然后我进行了排序。如果 set 是可排序的,它会更简单,但它可以工作:D
【解决方案3】:

您可以将字符串列表保存为带有分隔符的单个字符串。 例如这是你的数组:

["Italy", "France", "Spain", "Japan", "United States"]

您可以将其保存为:

"Italy;France;Spain;Japan;United States"

在代码中:

SharedPreferences sharedPref = mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);
Editor editor = sharedPref.edit();

// countries is your List
String countriesString = TextUtils.join(";", countries);
editor.putString("countries", countriesString);
editor.apply();

要检索您的数据:

final String countriesString = sharedPref.getString("countries", "");
List<String> countries = new ArrayList<>();
if (!countriesString.isEmpty()){
    countries = new ArrayList<>(Arrays.asList(countriesString.split(";")));
}

【讨论】:

  • 这实际上是保存非文本元素数组的最佳选择
  • 这有点冒险,除非您可以肯定地保证没有任何值实际上包含分隔符。
  • @KonradMorawski 你是对的,无论如何分隔符可以是你想要的任何字符。另一种方法是创建一个 JSONArray 并将其保存为字符串;然后要检索它,您可以加载字符串并再次创建 JSONArray。
【解决方案4】:
fun SharedPreferences.putNewStringIntoList(newString:String){
    val previous =getString(YOUR_KEY,"")?:""
    val without =previous.replace("${newString}|","")//Remove if already inside
    edit().putString(YOUR_KEY,"${without}|${newString}").apply()
}



fun SharedPreferences.getSortedList():List<String>{
    val strings =getString(YOUR_KEY,"")?:""
    return devices.split("|")
}

这适用于 Kotlin,替换 |任何字符的字符都保证不在您的字符串中。

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 2014-02-19
    • 2021-04-24
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多