2012-11-19 100 views
17

我嘗試保存/恢復一組字符串,除了一件事情之外,所有工作都正常。 當我創建我的琴絃,我把:android SharedPreferences putStringSet訂單/排序

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

命令是例如「blutooth」「應用」「數據」。 當我回來設置:

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

我得到「應用」,「藍牙」,「數據」他們是按名稱排序,我不希望這樣。 我想得到相同的訂單,我有保存。 任何人都可以幫助我?

+0

我知道這不是你正在尋找的答案,但是你真的需要SharedPrefs嗎?也許靜態列表或數據庫會更容易? – daniel

回答

17

這是不可能的。集合是無序集合。

+1

即使'LinkedHashSet'? – Squonk

+6

@Squonk:沒有幫助。 'SharedPreferences'在重新讀入時將使用'HashSet'。 – CommonsWare

+0

啊,好的。從來沒有嘗試過,所以我不確定。有用的知道。 – Squonk

7

您可以用數字作爲您的字符串的前綴,例如00application01bluetooth02data,按照您希望將其排除的順序。將從getStringSet返回到Array<Set>並對其進行排序。

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

謝謝:)我把序列化的對象置於設置下,所以我已經把這個對象下的字段「位置」,並在我做了排序。如果設置可排序它更簡單,但它的工作原理:D – jaumard

2

您可以使用分隔符將字符串列表保存爲單個字符串。 例如,這是你的數組:

["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(";"))); 
} 
+0

這個作品謝謝你! –

+0

這實際上是保存非文本元素數組的最佳選擇 – NikkyD