2013-05-30 61 views
1

我想轉換爲設置爲一個數組。我希望它存儲放置在其中的元素的插入順序。SharedPreferences是否將傳遞的Set <T>複製到另一個類型?

我正在構建的集合被傳入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 ! 

看來,在內部,它複製傳遞的數據爲另一種類型集...

我也嘗試過其他的toArray(T [])方法,用沒有成功。

我做錯了什麼?

+0

嘗試看看是否這將表現爲預期。 [docs](http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html)表示迭代應該按照插入元素的順序,但不會說任何內容關於該方法。 –

回答

1

如果你看看JavaDoc for LinkedHashSet它指出:

哈希表和Set接口的鏈接列表實現,具有 預知的迭代順序。

這裏的關鍵是「迭代順序」。您應該使用

set.iterator() 

以獲取插入順序中的元素。

乾杯,

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 
相關問題