[英]Order missing while converting to ArrayList from HashSet
我正在将ArrayList
转换为HashSet
,然后将HashSet
转换为ArrayList.
运行良好。 我已经按顺序传递了ArrayList
。 但是我得到不同顺序的结果。 如何解决呢?
public void saveAlbumList(ArrayList<String> values) {
Set<String> set = new HashSet<String>(values);
pref_selected_photos.edit().putStringSet("AlbumList", set).commit();
}
public ArrayList<String> getAlbumList() {
ArrayList<String> pathList = new ArrayList<String>();
try {
Set<String> set = pref_selected_photos.getStringSet("AlbumList",
null);
if (set != null && set.size() > 0) {
pathList = new ArrayList<String>(set);
}
} catch (Exception e) {
e.printStackTrace();
}
return pathList;
}
提前致谢!
如@dreamCoder所述,您需要使用LinkedHashSet
不要将值直接分配给
LinkedHashSet
。 迭代ArrayList
并添加它
更改您的方法代码:
public void saveAlbumList(ArrayList<String> values) {
Set<String> set = new LinkedHashSet();
for(String name : values){
set.add(name);
}
pref_selected_photos.edit().putStringSet("AlbumList", set).commit();
}
希望它能对您有所帮助:)
HashSet
不会保留元素添加顺序。 首先,它计算应该保持恒定但难以预测的对象哈希码,然后使用它选择一个存储桶,该存储桶是已选择了相同存储桶的对象列表。 由于Iterator
仅遍历所有存储桶,因此迭代顺序在很大程度上是不可预测的。
如果需要保留订单,请改用LinkedHashSet 。 但是, LinkedHashSet
维护其他链接列表,因此需要更多资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.