Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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中存储ArrayList?_Java_Android_Arraylist_Sharedpreferences_Hashset - Fatal编程技术网

Java 如何在SharedReferences中存储ArrayList?

Java 如何在SharedReferences中存储ArrayList?,java,android,arraylist,sharedpreferences,hashset,Java,Android,Arraylist,Sharedpreferences,Hashset,我有一个分类的ArrayList联系人列表。我想将列表存储在SharedReference中。我尝试了以下代码: SharedPreferences.Editor editor = app_preference.edit(); Set<String> set = new HashSet<String>(); set.addAll(contact_names_list); editor.putStringSet("CONTACT_LIST", set); editor.ap

我有一个分类的
ArrayList
联系人列表。我想将列表存储在
SharedReference
中。我尝试了以下代码:

SharedPreferences.Editor editor = app_preference.edit();
Set<String> set = new HashSet<String>();
set.addAll(contact_names_list);
editor.putStringSet("CONTACT_LIST", set);
editor.apply();
SharedReferences.Editor=app_preference.edit();
Set=newhashset();
set.addAll(联系人姓名列表);
编辑器.putStringSet(“联系人列表”,set);
editor.apply();
问题是,当我从
HashSet
检索这个时,我得到了一个未排序的列表。除了
Hashset
之外,还有其他方法存储
ArrayList
吗?

检索值

Set<String> set = myScores.getStringSet("CONTACT_LIST", null);
Set Set=myScores.getStringSet(“联系人列表”,null);
这样做-:

SharedPreferences.Editor editor = app_preference.edit();
        Set<String> set = new HashSet<String>();
        set.addAll(contact_names_list);
        editor.putStringSet("CONTACT_LIST", set);
        editor.apply();

or

Prefs.with(getAppContext()).putStringSet("CONTACT_LIST", set);
SharedReferences.Editor=app_preference.edit();
Set=newhashset();
set.addAll(联系人姓名列表);
编辑器.putStringSet(“联系人列表”,set);
editor.apply();
或
Prefs.with(getAppContext()).putStringSet(“联系人列表”,set);
使用以下代码检索值-:

Set<String> existindData = Prefs.with(getAppContext()).getStringSet("CONTACT_LIST", null);
Set existindData=Prefs.with(getAppContext()).getStringSet(“联系人列表”,null);

我们可以使用Java 8排序方式对集合进行排序。
Set s=newhashset();
s、 添加(“库纳尔”);
s、 添加(“Bhism”);
s、 添加(“工作”);
s、 添加(“Abdgg”);
s、 添加(“PSS”);
s、 添加(“工作”);
List l=s.stream().sorted().collect(Collectors.toList());
系统输出打印LN(l)

尝试上面的代码,您现在将获得排序的哈希集。

正如Android文档所解释的,共享首选项是保存键值数据的一种方法。考虑到字典在幕后几乎可以以随机顺序保存,所以无法按顺序检索某些内容。不过,我可以推荐几种解决方案:

  • 简单但性能不好的方法:添加索引作为值的一部分,因此您可以创建一个具有哈希集大小的数组,然后迭代哈希集并添加您创建的数组中的每个元素。O(N)时间复杂性加上文件读取过程中涉及的复杂性
  • 将数据保存在本地SQLite数据库中:此解决方案在将来更加灵活(您可以添加新联系人)。通常,您创建自己的SQLite数据库,将其放入资产中,然后导入。您可以创建查询,以便按照您想要的顺序进行查询(可能会为此创建一列)

  • 简单不可扩展选项:在values
    文件夹中
    始终可以创建一个
    strings.xml
    文件,您可以将该数据作为
    字符串数组

    
    A.
    B和用户
    C
    D
    E
    

  • 如果你需要更结构化的东西,我已经做过类似的事情(保存为JSON)

    
    {id:1,name:Performance,sub:[{id:2,name:Scalability},{id:3,name:Response\u Time}]}
    {id:4,name:Security,sub:[{id:5,name:Availability,sub:[{id:6,name:Reliability},{id:7,name:Recovery}]},{id:8,name:Privacy}]}
    {id:9,name:Interoperability}
    {id:10,名称:维修性}
    {id:12,name:Testability}
    {id:13,name:Usability,sub:[{id:14,name:Findability},{id:15,name:correction}]}
    
    在我的代码中:

    String[] elementsArray = getResources().getStringArray(
                    R.array.quality_attributes);
    
            for (int i = 0; i < attributesArray.length; i++) {
                Gson gson = new Gson();
                MyJsonObject obj = gson.fromJson(elementsArray[i],
                        MyJsonObject.class);
               // Do something
            }
    
    String[]elementsArray=getResources().getStringArray(
    R.数组。质量属性);
    for(int i=0;i

    一般来说,如果你想改变某些东西,第二种选择是最好的。如果您正在寻找一些简单的东西,那么第三个选项就足够了。

    因为
    putStringSet
    接受任何实现
    Set
    接口的类 您可以使用保留插入顺序的
    LinkedHashSet

    记录:

    此实现与HashSet的不同之处在于它维护 贯穿其所有条目的双链接列表。此链接 列表定义了迭代顺序,即 元素被插入到集合中(插入顺序)

    HashSet
    不保留插入顺序,这就是这里的问题所在

    // ...
    
    Set<String> set = new LinkedHashSet<String>();
    
    // insert from ArrayList
    set.addAll(contact_names_list);
    
    // or single elements
    set.add("Homer");
    set.add("Marge");
    
    editor.putStringSet("CONTACT_LIST", set);
    
    /。。。
    Set Set=newlinkedhashset();
    //从ArrayList插入
    set.addAll(联系人姓名列表);
    //还是单一元素
    集合。添加(“荷马”);
    集合。添加(“Marge”);
    编辑器.putStringSet(“联系人列表”,set);
    
    为什么不直接使用数据库呢?它将使事情变得更容易共享首选项以xml格式存储值,数据库是更好的选择option@WilliMentzel这可能是一个有序的列表。。。那么,要对它进行排序,有什么变化?@NoiseGenerator它怎么可能是一个有序列表?这是他案子中的一个哈希集。他如何知道检索后的插入顺序?那么信息就丢失了。请看我的答案。也许我没想清楚:D@Gibs如果从已排序的列表中删除项目,则生成的列表仍然是有序的。那么,为什么不在检索后对其进行排序(Noise Generator说了什么)?这是我为prefs制作的一个类。让我编辑它,感谢快速响应,我尝试了LinkedHashSet,但仍然得到未排序的列表。
    <string-array name="quality_attributes">
            <item>{id:1,name:Performance,sub:[{id:2,name:Scalability},{id:3,name:Response_Time}]}</item>
            <item>{id:4,name:Security,sub:[{id:5,name:Availability,sub:[{id:6,name:Reliability},{id:7,name:Recovery}]},{id:8,name:Privacy}]}</item>
            <item>{id:9,name:Interoperability}</item>
            <item>{id:10,name:Maintainability}</item>
            <item>{id:12,name:Testability}</item>
            <item>{id:13,name:Usability,sub:[{id:14,name:Findability},{id:15,name:Correctness}]}</item>
        </string-array>
    
    String[] elementsArray = getResources().getStringArray(
                    R.array.quality_attributes);
    
            for (int i = 0; i < attributesArray.length; i++) {
                Gson gson = new Gson();
                MyJsonObject obj = gson.fromJson(elementsArray[i],
                        MyJsonObject.class);
               // Do something
            }
    
    // ...
    
    Set<String> set = new LinkedHashSet<String>();
    
    // insert from ArrayList
    set.addAll(contact_names_list);
    
    // or single elements
    set.add("Homer");
    set.add("Marge");
    
    editor.putStringSet("CONTACT_LIST", set);