【问题标题】:set.addAll(myArrayList) doesn't add the items of list in the same orderset.addAll(myArrayList) 不按相同顺序添加列表项
【发布时间】:2017-05-26 12:42:50
【问题描述】:

无法弄清楚为什么 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?找到一个解决方案

【问题讨论】:

  • getSharedPrefSet 返回什么?如果它返回一个正常的Set,那就是你的问题。
  • @Vucko 是的,这是一个普通的 Set,但我看到返回它的顺序是正确的。

标签: android arraylist sharedpreferences linkedhashset


【解决方案1】:

我知道你的问题是什么!即使您将 set 初始化为应该保留项目顺序的 LinkedHashSet,请在此之后查看此行:

set = getSharedPrefSet("mySet");

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

来自LinkedHashSet的文档:

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

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

【讨论】:

  • 感谢您的回答,我正在研究它,但我认为您无法从 SharedPreferences .getStringSet 获得除 HashSet 之外的任何其他内容。
  • 是的,我是这么认为的......那么你需要找到一些解决方法,因为这不起作用 :) 考虑接受答案,因为我认为我们解决了问题所在。跨度>
猜你喜欢
  • 2023-03-07
  • 2022-11-04
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多