2

无法弄清楚为什么 set.addAll 会在订单切换的情况下添加我的列表。(我的集合仍然被声明为 LinkedHashSet)

该代码是关于从 SharedPreferences 获取 Set-List,将其转换为 ArrayList,将一项添加到列表,然后将整个列表添加到 Set。

代码看起来像这样:

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

前两个字符串正确添加(正如我调试的那样),但第三个字符串与第二个字符串切换位置。

输出:

在此处输入图像描述

getSharedPrefSet 函数:

Set getSharedPrefSet (String key) {
    sharedPrefs = this.getSharedPreferences("myPreferences", Context.MODE_PRIVATE);

    return sharedPrefs.getStringSet(key, null);
}

解决方法

一种解决方案可以在How can write code to make sharedpreferences for array in android?

4

1 回答 1

2

我可以看到你的问题是什么!即使您初始化setLinkedHashSet应该保留项目顺序的 a ,也请查看此行,然后:

set = getSharedPrefSet("mySet");

现在,我在这里看不到getSharedPrefSet方法实现,但是查看您提供的屏幕截图,我可以看到setnow HashSet。所以该方法必须返回HashSet,因此您丢失了您想要的订单,因为HashSet不保留它。

来自以下文档LinkedHashSet

Set 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashSet 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。

所以你需要做的是在这里实际采取不同的方法,因为无论你用什么初始化set变量,它都会被getSharedPrefSet方法返回的任何东西覆盖(所以初始化无论如何都是过时的)。找到另一种解决方法, sharedPrefs.getStringSet显然返回正常的HashSet.

于 2017-01-11T16:31:33.857 回答