2014-10-16 4 views
2

Я работаю над преобразованием ArrayList в HashSet, а затем HashSet в ArrayList. Он работает отлично. Я принял ArrayList в заказе. Но я получаю результат в другом порядке. Как это решить?Отсутствует при преобразовании в ArrayList из HashSet

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

Заранее благодарен!

+0

Может ли вы сказать мне, что это нужно 'преобразовать ArrayList в HashSet и тиски versa' ?? Просто сохранить его в SharedPreference ??? –

+0

Да. Я хочу сохранить его в SharedPreference. –

+1

Тогда почему вы используете ArrayList .. Прямо переключитесь на HashSet .. В противном случае я могу помочь вам сохранить ArrayList –

ответ

2

HashSet не сохраняет порядок добавления элементов. Сначала он вычисляет хэш-код объекта, который должен оставаться постоянным, но его трудно предсказать, а затем использует его для выбора ведра, который представляет собой список объектов, у которых был выбран тот же самый ковш. Поскольку Iterator просто выполняет итерации по всем ведрам, порядок итераций во многом непредсказуем.

Используйте, пожалуйста, LinkedHashSet, если вам нужно сохранить заказ. Однако LinkedHashSet поддерживает дополнительный связанный список, поэтому ему необходимо больше ресурсов.

+0

Это не работает. LinkedHashSet также возвращает неправильный порядок. –

+0

'LinkedHashSet' работает :) проверено @selva_pollachi –

+0

ссылается на это: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html – dreamcoder

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

Надеется, что это поможет вам :)

+0

Он работает до закрытия приложения. Как только я закрываю и открываю приложение, заказ снова изменяется. –

+0

Позвольте мне проверить и вернуться к вам. –