【问题标题】:Fastest way to store char[][] in shared preferences在共享首选项中存储 char[][] 的最快方法
【发布时间】:2023-03-21 12:30:01
【问题描述】:

在我的应用程序中,主要数据集是一个二维字符数组 (char[][]),其中一些值可能是不可打印的字符,甚至是 \0 字符。将此数组存储在共享首选项中并稍后检索它的最快方法是什么?对我来说,检索速度比保存速度重要得多。数组不是特别大,大概不超过100x100。

目前,我将其转换为字符串,只需将所有字符逐行、逐列连接起来,并将字符串与维度一起存储(如 int)。

我也考虑过只是将数组序列化(writeObject 变成ByteArrayOutputStreram,然后使用流的toString 方法),但还没有尝试过。

还有其他建议吗?同样,最快的检索(以及重新创建为 char[][] 数组)是我的主要关注点。

【问题讨论】:

    标签: java android multidimensional-array sharedpreferences arrays


    【解决方案1】:

    我向您发布了一种使用许多本机功能的方法,因此可能很快。请注意,这是未经测试的,只能用于鼓舞人心。

    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;
    }
    

    【讨论】:

    • 感谢您的回答,但不幸的是,StringSet 偏好设置方法仅适用于 Android 3.0 及更高版本。我的应用需要从 1.6 以上版本开始运行。
    • 好的,我看到了我的解决方案的弱点。一个小提示:当您关心性能时,请使用 ArrayListSparseArray 而不是 HashMap
    • 谢谢!我想虽然我的收藏只有 3-4 件,但这没什么大不了的,但随着它的规模越来越大,我一定会做出改变。
    【解决方案2】:

    因为StringSet 方法(put 和 get)仅在 Android 3.0 中可用,而且我发现在存储长字符串时首选项不太可靠,尤其是那些包含 0 字符的字符串,所以我使用了不同的数据存储方式在应用程序中。

    我使用内部文件(fileGetInputfileGetOutput),然后创建一个HashMap&lt;Integer, char[][]&gt; 并使用writeObject 将其写入文件。由于我有一些由整数 ID 标识的 char 数组,因此我可以一次性将它们全部保存。

    我确实意识到我可能会在性能方面有所损失,但在这种情况下,可靠性是第一位的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 2016-09-13
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多