3

在我的應用程序中,主要數據集是一個二維char數組(char[][]),其中一些值可能是非打印字符,甚至是\0字符。將這個數組存儲在共享的prefs中並在以後檢索它的最快方法是什麼?檢索速度比保存速度更重要。陣列不是特別大,可能不會超過100x100。在共享首選項中存儲char [] []的最快方法

目前,我將其轉換成一個字符串通過簡單地連接所有字符,行逐行,列逐列,並與尺寸一起存儲的字符串(如INT)。

我也考慮過只是串行化數組(writeObjectByteArrayOutputStreram,然後使用流的toString方法),但還沒有嘗試過。

其他建議?同樣,儘可能快的檢索(以及char [] []數組的重新創建)是我最關心的問題。

回答

0

因爲StringSet方法(put和get)僅適用於Android 3.0,也因爲我發現存放長字符串時喜好小於可靠的,尤其是那些包含0個字符,我用不同的方式將數據存儲在應用程序中。

我使用內部文件(fileGetInputfileGetOutput),然後創建一個HashMap<Integer, char[][]>,並將其寫入使用writeObject文件。由於我有一些char數組,用一個整數ID來標識,所以我一次性將它們全部保存起來。

我不知道,我可能會失去在性能方面的東西,但是在這種情況下的可靠性是第一位的。

0

我貼你,它使用許多原生功能,因此很可能會快速的方式。請注意,這是未經測試的,只能用於鼓舞人心。

public void save(char[][] chars) { 
    Set<String> strings = new LinkedHashSet<String>(chars.length); 

    for(int i = 0, len = chars.length; i < len; i++) { 
     strings[i] = new String(chars[i]); 
    } 

    getSharedPreferences().edit().putStringSet("data", strings).commit(); 
} 

public char[][] read() { 
    Set<String> strings = getSharedPreferences().getStringSet("data", new LinkedHashSet<String>()); 

    char[][] chars = new char[strings.size][]; 
    int i = 0; 

    for(String line : strings) { 
     chars[i++] = line.toCharArray(); 
    } 

    return chars; 
} 
+0

謝謝您的回答,但不幸的是,'喜好StringSet'方法僅適用於Android 3.0起。我的應用程序需要從1.6以上的工作。 – 2012-03-26 09:18:51

+0

好吧,我看到了我的解決方案的弱點。一個小提示:當你關心性能時,使用ArrayList 或[SparseArray](http://developer.android.com/reference/android/util/SparseArray.html)而不是HashMap 。 – damaxxed 2012-03-26 09:32:17

+0

謝謝!我想,雖然我在這個系列中只有3-4件商品,但這不是什麼大問題,但隨着它的規模不斷擴大,我一定會做出改變。 – 2012-03-26 09:34:58