1

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

我正在构造的集合被传递到SharedPreferencesputStringSet 方法中的一个对象。

我的代码:

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[]) 方法,但没有成功。

我做错了什么?

4

2 回答 2

1

如果您查看LinkedHashSet 的 JavaDoc,它会指出:

Set 接口的哈希表和链表实现,具有可预测的迭代顺序。

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

set.iterator()

以插入顺序获取元素。

干杯,

于 2013-05-30T06:10:05.657 回答
0

Set的 javadoc说明如下:

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

正如 LinkedHashSet 所述:

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

然后它应该工作。

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

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

    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
于 2013-05-30T06:20:03.117 回答