从HashSet转换为ArrayList时订单丢失

时间:2014-10-16 11:06:47

标签: java android arraylist set 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;
}

提前致谢!

2 个答案:

答案 0 :(得分:3)

正如@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();
    }

希望它会对你有所帮助:)。

答案 1 :(得分:2)

HashSet不保留元素添加顺序。首先,它计算应该保持不变但很难预测的对象哈希码,然后使用它来选择一个桶,该桶是已选择相同桶的对象列表。由于Iterator只是迭代所有桶,迭代顺序在很大程度上是不可预测的。

如果您需要保留订单,请使用LinkedHashSet。但是LinkedHashSet维护了一个额外的链表,因此需要更多资源。