Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.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 将项目添加到集合<;字符串>;按顺序_Java_Android_Setstring - Fatal编程技术网

Java 将项目添加到集合<;字符串>;按顺序

Java 将项目添加到集合<;字符串>;按顺序,java,android,setstring,Java,Android,Setstring,我正在创建一个歌曲播放应用程序。我有一套,我保存在共享参考资料中。我想从中添加和删除文件名,并保持它们的顺序与我在中添加它们的顺序相同,例如: recentsp = getSharedPreferences("recentkey", Context.MODE_PRIVATE); recent = recentsp.getStringSet("recent", recent); recentedited = recent; if (recentedited.contai

我正在创建一个歌曲播放应用程序。我有一套,我保存在共享参考资料中。我想从中添加和删除文件名,并保持它们的顺序与我在中添加它们的顺序相同,例如:

recentsp = getSharedPreferences("recentkey", Context.MODE_PRIVATE);

    recent = recentsp.getStringSet("recent", recent);
    recentedited = recent;

    if (recentedited.contains(string) {
        recentedited.remove(string);
        Log.i(TAG, "Recent exists, removing song");
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recentedited);
        editor.commit();
    }

        recentedited.add(string);
    Log.i(TAG, "adding song to recent");
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recentedited);
        editor.commit();
但当我在ListView中查看这些时,问题就出现了。我希望他们按照我添加他们的顺序,这样我就可以有一个最近播放的部分,但有时他们根本不移动,或者可能他们在一开始就结束了。这似乎是随机的。我错过什么了吗

编辑:

我检查以确保SharedReferences不为null,方法是在初始化步骤中执行此操作

编辑:

即使使用LinkedHashSet,我仍然没有得到正确的排序。我只在SharedReferences为null时调用它,因此我不确定如何确保使用LinkedHashSet

        recentsp = getSharedPreferences("recentkey", Context.MODE_PRIVATE);
    recent = recentsp.getStringSet("recent", null);
    if (recent == null) {

        recent = new LinkedHashSet<String>();
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recent);
        editor.commit();
    }
recentsp=getSharedReferences(“recentkey”,Context.MODE\u PRIVATE);
最近的=最近的sp.getStringSet(“最近的”,null);
如果(最近==null){
最近=新LinkedHashSet();
SharedReferences.Editor=recentsp.edit();
编辑器.clear();
编辑器.putStringSet(“最近的”,最近的);
commit();
}

如果您正在寻找保留插入顺序的
Set
接口的实现,请从
HashSet
切换到:
LinkedHashSet
。所有标准
Set
行为都保持不变,添加了插入顺序迭代

从关联的JavaDoc:

哈希表和链表的集合接口实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,即元素插入到集合中的顺序(插入顺序)。请注意,如果将图元重新插入到集合中,则插入顺序不受影响。(如果s.contains(e)在调用前立即返回true时调用s.add(e),则元素e将重新插入到集合s中。)

此实现使其客户机免于HashSet提供的未指定、通常混乱的排序,而不会增加与TreeSet相关的成本。它可以用于生成与原始集顺序相同的集的副本,而不管原始集的实现如何


也许只需要使用ArrayList而不是Set—看起来您已经有了确保删除和添加该项(如果该项已经在集合中)的代码—该模式应该与ArrayList一起使用

如果您需要代码将列表序列化为首选项,这个老问题有一个例子,或者使用类似GSON的东西来存储和检索

我有一套,我保存在共享参考资料中。我想从中添加和删除文件名,并使它们保持相同的顺序

这是不可能的。您不控制
集合
的实现,并且不需要订购
集合
。你的选择是:

  • 不要担心订单,或者

  • 不要将字符串集与
    SharedReferences
    一起使用,而是将值存储在单个字符串中(例如,编码为JSON),或者

  • 不要使用
    SharedReferences
    ,而是使用其他一些数据存储选项(例如SQLite数据库、JSON文件)


  • 快速浏览一下
    getStringSet
    的文档就会发现:“请注意,您不能修改此调用返回的set实例。如果您这样做,则无法保证存储数据的一致性,也无法保证您修改该实例的能力。”因此,您应该将它们复制到新的
    set
    实现中,并对其进行修改,把它放进去。此外,看起来您应该能够控制
    Set
    实现——您最初使用的是什么实现?当我再次拉出它时,我不会遇到同样的问题吗?如果我把它放进一个新的集合,然后重写旧的集合。当我调用
    getStringSet
    时,它会不会以错误的顺序吐出我的集合;从API看来,维护任何形式的顺序都可能不是一个可用的功能。但是,您可能应该首先修改代码,以避免完全按照文档中告诉您不要做的操作,然后处理此错误。我不理解您控制集合实现的意思。
    最近的
    最初设置为什么,在此代码发生之前?我只是用更改编辑了我的答案,但它似乎仍然没有保留我的顺序。@MJDude与其尝试将每个歌曲标题保存为单独的
    SharedReference
    ,为什么不将列表保存为单个值?将播放列表保存为不同类型的资源可能会感觉更自然;我并不想说得很关键,但它实际上并不是一个控制应用程序在运行时如何运行的设置值——它实际上只是一个保存状态。然后你就可以完全控制你想要的排序方式了。我已经把歌曲的标题放在一个单子里了。但是,您建议以其他方式保存它吗?与其创建一个
    Set
    ,其中每个
    String
    都是一个单独的歌曲标题,然后将
    Set
    添加为一组
    SharedReference
    值,我想描述的只是一个
    String
    ,作为单个
    首选项添加,并构造单个值,使其包含由分隔符分隔的所有歌曲标题。如果选择分号作为分隔符,则单个
    首选项的值将类似于:“歌曲标题1;歌曲标题2;非常非常长的歌曲标题3;歌曲标题4”等。谢谢,我就是这么做的!