HashSet中的项目顺序不正确

时间:2013-09-16 19:48:30

标签: android hashset

作为练习,我正在开发一个简单的笔记应用程序。显然必须持续保存笔记,所以我有以下方法:

public static void saveNotesPersistently() {
    SharedPreferences.Editor editor = sharedPreferences.edit();
    HashSet<String> titleSet = new HashSet<String>();
    HashSet<String> contentSet = new HashSet<String>();
    for (int i = 0; i < Library.notes.size(); i++) {            
        String title = (Library.notes.get(i).title == null) ? "No title" : Library.notes.get(i).title;

        Log.d("Checks", "Saving note with title: " + title);

        String content = (Library.notes.get(i).content == null) ? "No content yet" : Library.notes.get(i).content;
        titleSet.add(title);
        contentSet.add(content);
    }

    Log.d("Checks", "Saving title set: " + titleSet);

    editor.putStringSet("noteTitles", titleSet);
    editor.putStringSet("noteContents", contentSet);
    editor.commit();
}

奇怪的是,第一个日志中的音符标题的顺序与第二个日志中的音符标题的顺序不同。显然titleSet.add(title)出现了问题。我不知道为什么。有人知道这里发生了什么吗?

修改

所以我发现这是因为没有订购HashSet。这给我带来了另一个问题,因为我正在加载这样的笔记:

Set<String> noteTitles = sharedPreferences.getStringSet("noteTitles", null);
Set<String> noteContents = sharedPreferences.getStringSet("noteContents", null);

现在订单在保存时是正确的,但加载后再次出错。不幸的是,有sharedPreferences.getLinkedHashSet()之类的东西,那么我该怎么做呢?

3 个答案:

答案 0 :(得分:3)

使用LinkedHashSet代替,使用可预测的迭代顺序。

请参阅docs here

答案 1 :(得分:2)

根据要求,这是使用JSONArray序列化的示例。

存储数据:

SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("jsonArray", new JSONArray(list).toString());
editor.commit();

检索数据:

try {
    JSONArray jsonArray = new JSONArray(sharedPreferences.getString(
            "jsonArray", null));
    // jsonArray contains the data, use jsonArray.getString(index) to
    // retreive the elements

} catch (JSONException e) {
    e.printStackTrace();
}

答案 2 :(得分:0)

HashSet不保证元素的顺序。如果您需要订购元素,请考虑使用TreeSet