Android set.addAll(myArrayList)不';t按相同顺序添加列表中的项目
我不明白为什么set.addAll会在切换订单的情况下添加我的列表。(我的集合仍然声明为LinkedHashSet) 代码是关于从SharedReferences获取集合列表,将其转换为ArrayList,向列表中添加一项,然后将整个列表添加到集合中 代码如下所示:Android set.addAll(myArrayList)不';t按相同顺序添加列表中的项目,android,arraylist,sharedpreferences,linkedhashset,Android,Arraylist,Sharedpreferences,Linkedhashset,我不明白为什么set.addAll会在切换订单的情况下添加我的列表。(我的集合仍然声明为LinkedHashSet) 代码是关于从SharedReferences获取集合列表,将其转换为ArrayList,向列表中添加一项,然后将整个列表添加到集合中 代码如下所示: Set<String> set = new LinkedHashSet<String>(); List<String> stringList = new ArrayList<String
Set<String> set = new LinkedHashSet<String>();
List<String> stringList = new ArrayList<String>();
///
set = getSharedPrefSet("mySet");
stringList = new ArrayList<String>(set);
stringList.add(message);
set.addAll(stringList); //this messes up my order
saveSharedPrefSet("mySet", set);
解决方法
可以在找到一个解决方案。我可以看出您的问题所在!即使您正在将
set
初始化为LinkedHashSet
,以保持项目的顺序,请查看这一行,然后:
set = getSharedPrefSet("mySet");
现在,我没有看到这里的getSharedPrefSet
方法实现,但是查看您提供的屏幕截图,我可以看到set
现在是HashSet
。因此,该方法必须返回HashSet
,因此您将丢失所需的顺序,因为HashSet
没有保留它
从LinkedHashSet
的文档中:
哈希表和链表的集合接口实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链接列表
所以你需要做的是在这里采取一种不同的方法,因为不管你用什么初始化你的
set
变量,它都会被getSharedPreSet
方法返回的任何内容覆盖(所以初始化无论如何都是过时的)。另一种方法是,sharedPrefs.getStringSet
显然返回一个正常的HashSet
getSharedPrefs返回什么?如果它返回一个正常的集,那就是你的问题所在。@Vucko是的,这是一个正常集,但正如我看到的返回顺序一样,它是正确的。谢谢你的回答,我正在研究它,我认为除了从SharedReferences.getStringSet.getStringSet.Yeah,我想是的。。。那么,你需要找到一些解决办法,因为这是行不通的:)考虑接受答案,因为我认为我们破解了这个问题。
set = getSharedPrefSet("mySet");