SharedPreferences是否将传递的Set <t>复制到另一种类型?</t>

时间:2013-05-30 05:54:30

标签: java android set hashset

我正在尝试将Set转换为数组。我希望它存储放置在其中的元素的插入顺序。

我正在构建的集合被传递到putStringSet方法中的SharedPreferences对象。

我的代码:

Set<String> set = new LinkedHashSet<String>();

set.add(element.getTitle());
set.add(element.getMessage());
set.add(Boolean.toString(element.getSomeBoolOption()));
set.add(Long.toString(something));

// set to SharedPreferences
prefs.putStringSet("key", set);

when converting this to an array, the order is not preserved:

prefs.getStringSet("key").toArray();

// elements in data array are not ordered according to the insertion order !

在内部,它似乎将传递的数据复制到另一种类型的Set ...

我还尝试了另一种toArray(T [])方法,但没有成功。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果您查看JavaDoc for LinkedHashSet,请说明:

  

使用Set接口的哈希表和链表实现   可预测的迭代顺序。

这里的关键点是“迭代顺序”。你应该使用

set.iterator()

以插入顺序获取元素。

干杯,

答案 1 :(得分:0)

Set的javadoc声明如下:

  

返回包含此set中所有元素的数组。如果此set对其迭代器返回的元素的顺序有任何保证,则此方法必须以相同的顺序返回元素。

由于LinkedHashSet声明如下:

  

Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。请注意,如果将元素重新插入到集合中,则不会影响插入顺序。 (如果s.contains(e)在调用之前立即返回true,则调用s.add(e)时,将元素e重新插入到集合中。)

然后它应该工作。

您能提供您在示例中使用的值吗?

请参阅下面的代码(并尝试一下):

    public class Main {
    public static void main(String [] args){
        final LinkedHashSet<Object> set = new LinkedHashSet<Object>();
        System.out.print("adding following items: ");
        for(int i=1; i<6; i++){
            set.add(String.valueOf(i));
            System.out.print(" " + i);
        }
        set.add(Boolean.TRUE);
        set.add(12f);
        set.add(60d);
        set.add('a');

        System.out.println();

        final Object [] result = set.toArray();

        for(final Object num : result){
            System.out.println("found value: " + num);
        }
    }
}

结果如下:

adding following items:  1 2 3 4 5
found value: 1
found value: 2
found value: 3
found value: 4
found value: 5
found value: true
found value: 12.0
found value: 60.0
found value: a