2012-11-19 9 views
17

Próbuję zapisać/przywrócić zestaw ciąg i wszystko działa z wyjątkiem jednej rzeczy. gdy tworzę moje struny kładę:android SharedPreferences putStringSet sortowanie/sortowanie

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

Zamówienie jest na przykład „blutooth” „Aplikacja” „dane”. kiedy wrócę set:

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

otrzymuję „Aplikacja” „Bluetooth” „dane” są sortować według nazwy, a nie chcę tego. Chcę uzyskać tę samą kolejność, którą mam. Ktoś może mi pomóc?

+0

I wiem, że nie jest to odpowiedź, której szukasz, ale zrób to naprawdę potrzebujesz SharedPrefs do tego? Może statyczna lista lub db byłaby łatwiejsza? – daniel

Odpowiedz

17

To nie jest możliwe. Zbiory są kolekcjami nieuporządkowanymi.

+1

Nawet 'LinkedHashSet'? – Squonk

+6

@Squonk: Nie pomoże. 'SharedPreferences' użyje' HashSet' podczas odczytu z powrotem. – CommonsWare

+0

Ah, OK. Nigdy tego nie próbowałem, więc nie byłem pewien. Przydatne wiedzieć. – Squonk

7

Możesz poprzedzić ciągi przez liczby, na przykład 00application, 01bluetooth, 02data, w kolejności, w jakiej chcesz je uzyskać. Wstaw numer Set<String> zwrócony z getStringSet w pliku i posortuj go.

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

Dzięki :) Umieściłem serializowany obiekt pod zestawem, więc umieściłem pola "position" pod tym obiektem i po tym, jak sortuję. Jeśli zestaw był do sortowania, był prostszy, ale działa: D – jaumard

2

Możesz zapisać listę ciągów jako pojedynczy ciąg z ogranicznikiem. Na przykład jest to Twoja tablica:

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

można zapisać jako:

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

w postaci kodu:

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(); 

Aby pobrać dane:

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

To dziękuje! –

+0

jest to w rzeczywistości najlepsza opcja do zapisywania tablic elementów nietekstowych – NikkyD