Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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
Android set.addAll(myArrayList)不';t按相同顺序添加列表中的项目_Android_Arraylist_Sharedpreferences_Linkedhashset - Fatal编程技术网

Android set.addAll(myArrayList)不';t按相同顺序添加列表中的项目

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.addAll会在切换订单的情况下添加我的列表。(我的集合仍然声明为LinkedHashSet)

代码是关于从SharedReferences获取集合列表,将其转换为ArrayList,向列表中添加一项,然后将整个列表添加到集合中

代码如下所示:

 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");