以正确的顺序将项添加到Set <String> Java

MJD*_*ude 3 java android setstring

我正在创建一个歌曲播放应用程序.我有一个我在SharedPreferences中保存的Set.我想从中添加和删除文件名,并按照我添加它们的顺序保存它们,例如:

recentsp = getSharedPreferences("recentkey", Context.MODE_PRIVATE);

    recent = recentsp.getStringSet("recent", recent);
    recentedited = recent;

    if (recentedited.contains(string) {
        recentedited.remove(string);
        Log.i(TAG, "Recent exists, removing song");
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recentedited);
        editor.commit();
    }

        recentedited.add(string);
    Log.i(TAG, "adding song to recent");
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recentedited);
        editor.commit();
Run Code Online (Sandbox Code Playgroud)

但是当我在ListView中查看这些问题时会出现问题.我希望它们按照我添加它们的顺序,以便我可以有一个最近播放的部分,但有时它们根本不移动,或者它们可能最终在开头.这似乎是随机的.我错过了什么吗?

编辑:

我通过在初始化步骤中执行此操作来检查以确保SharedPreferences不为空...

编辑:

即使使用LinkedHashSet,我仍然没有得到正确的订购.如果SharedPreferences为null,我只调用它,所以我不确定如何确保我使用的是LinkedHashSet.

        recentsp = getSharedPreferences("recentkey", Context.MODE_PRIVATE);
    recent = recentsp.getStringSet("recent", null);
    if (recent == null) {

        recent = new LinkedHashSet<String>();
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recent);
        editor.commit();
    }
Run Code Online (Sandbox Code Playgroud)

Sea*_*key 6

如果您正在寻找Set保留插入顺序的接口的实现,请切换HashSet到:LinkedHashSet.所有标准Set行为都保持不变,增加了插入顺序迭代.

从关联的JavaDoc:

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

此实现使其客户端免受HashSet提供的未指定的,通常是混乱的排序,而不会导致与TreeSet相关的增加的成本.无论原始集的实现如何,它都可用于生成与原始集具有相同顺序的集的副本