我正在尝试将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 [])方法,但没有成功。
我做错了什么?
答案 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