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”等。谢谢,我就是这么做的!