Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有人能解释一下SharedReferences是如何存储字符串集的吗_Java_Android_Sharedpreferences - Fatal编程技术网

Java 有人能解释一下SharedReferences是如何存储字符串集的吗

Java 有人能解释一下SharedReferences是如何存储字符串集的吗,java,android,sharedpreferences,Java,Android,Sharedpreferences,我试图在共享首选项中保存一个名称列表,并希望利用SharedReferencesputStringSet,这样我就不需要多个键值对了。 我知道常规的HashSet不能保证迭代顺序,所以我使用LinkedHashSet来维护迭代顺序作为插入顺序,并将其保存到共享首选项中 在检索同一字符串集时,我还使用了LinkedHashSet,但顺序与最初插入时不同 我解决了这个问题,只需将名称存储在逗号分隔的字符串中,然后对其进行解析,所以这不是我的问题 我想知道SharedReferences对一组字符串做

我试图在共享首选项中保存一个名称列表,并希望利用
SharedReferences
putStringSet
,这样我就不需要多个键值对了。
我知道常规的
HashSet
不能保证迭代顺序,所以我使用
LinkedHashSet
来维护迭代顺序作为插入顺序,并将其保存到共享首选项中

在检索同一字符串集时,我还使用了
LinkedHashSet
,但顺序与最初插入时不同

我解决了这个问题,只需将名称存储在逗号分隔的字符串中,然后对其进行解析,所以这不是我的问题


我想知道
SharedReferences
对一组字符串做了什么,使得它不能保持正确的顺序(至少不是我想要的顺序)?

我经常使用的一个技巧是
JSON
。 将复杂对象转换为
JSON
,并将其作为简单字符串保存到
SharedReferences

您只需要几行代码就可以做到这一点

看看流行的
JSON
库,如和

下面是一个util类,您可以使用它将对象转换为
JSON
,反之亦然

public class JsonUtils {
    private JsonUtils() {
    }
    public static String convertObjectToJSONString(Object object) {
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonObject = "";
        try {
            jsonObject = objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }
    public static<T> T parseObjectFromString(String json,Class<T> objectClass) {
        ObjectMapper objectMapper = new ObjectMapper();
        T object = null;
        try {
            object = objectMapper.readValue(json, objectClass);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return object;
    }
}

您也可以使用普通的old
ObjectOutputStream
将对象转换为
字节[]
字符串
,然后保存它。但正如许多人所注意到的,这超出了这个问题的范围。

简而言之,要回答您的问题,它将通过从您的值创建一个简单的哈希集来取消链接您的链接哈希集。。。从那一点开始-没有秩序的联系

源代码:

public Editor putStringSet(String key, Set<String> values) {
        synchronized (this) {
            mModified.put(key,
                    (values == null) ? null : new HashSet<String>(values));
            return this;
        }
    }
公共编辑器putStringSet(字符串键,设置值){
已同步(此){
修改。放置(键,
(值==null)?null:新哈希集(值));
归还这个;
}
}

这就是为什么,就像您所做的,如果您想保持顺序,您需要使用分隔符(您使用的是coma)存储为字符串然后拆分分隔符以获得一个数组。

这如何回答如何存储
字符串集的问题?这根本没有回答问题。没有回答问题,但在将来会很有用。谢谢@p1g1n我刚刚更新了unswer,请看一看这是一个很好的技巧。不幸的是,有两件事。使用HashSet将混合条目值而不保留顺序。这张海报是为了保持准确的秩序,这是很难实现的,因为本土阶级把它搞砸了。其次,除非您在后台线程中,否则不应该使用commit()而应该使用apply()。我想这很简单。谢谢,我得多看看源代码。我经常这样做。然后不得不扩展很多本机类来添加自定义功能…:-)
public Editor putStringSet(String key, Set<String> values) {
        synchronized (this) {
            mModified.put(key,
                    (values == null) ? null : new HashSet<String>(values));
            return this;
        }
    }