【问题标题】:LinkedHashSet does not main insertion order?LinkedHashSet 没有主插入顺序?
【发布时间】:2023-03-17 08:31:01
【问题描述】:

我目前正在构建一个 Android 应用程序,用于显示名人的名言。我有一个主屏幕和 2 个其他屏幕,其中显示所有报价,另一个显示最喜欢的报价。

所以,当我点击 AllQuotesActivity 屏幕中的like 按钮时,引用和作者将保存在 LinkedHashSet 中,该 LinkedHashSet 将保存在 SharedPreferences 中,因此我的 FavouriteQuotes Activity 可以获取数据。我可以获取数据,但是数据是混杂的,尽管其他链接说LinkedHashSet维护了插入顺序。也许我做错了什么。以下是重要的代码sn-ps:

AllQuotesActivity.java:

SharedPreferences sharedPref;
Set<String> set = new LinkedHashSet();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.all_quotes);

    Resources res = getResources();
    Context context = getApplicationContext();
    this.sharedPref = context.getSharedPreferences(
            "MyPref", Context.MODE_PRIVATE);
    final String[] quotesAndAuthors = res.getStringArray(R.array.quotes);

    button3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            set.add(quotesAndAuthors[counter]);
            set.add(quotesAndAuthors[counter + 1]);
        }
    });

}

@Override
public void onPause() {
    super.onPause();
    Log.d("RichQuotes", "Its paused mkay");

    Editor editor = sharedPref.edit();

    editor.putStringSet("quotesAndAuthors", this.set);
    editor.commit();
}

}

FavoriteQuotesActivity.java:

SharedPreferences sharedPref;
Set<String> set = new LinkedHashSet();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.favourite_quotes);

    Resources res = getResources();
    Context context = getApplicationContext();
    this.sharedPref = context.getSharedPreferences(
            "MyPref", Context.MODE_PRIVATE);

    set = sharedPref.getStringSet("quotesAndAuthors", null);

    for (Iterator<String> it = set.iterator(); it.hasNext(); ) {
        String s = it.next();
        Log.v("test", s);
    }

我删除了不必要的代码。

在 FavouriteQuotesActivity.java 中,我正在记录该集合以检查其值。日志输出和屏幕上的输出是相同的,都以相同的方式未排序。

【问题讨论】:

  • 如果你能把它简化为一个简单的代码块,它会实例化一个链接的哈希集,添加一些数据,然后迭代这个集,这将会很有帮助
  • 感谢您的提示,我删除了不必要的代码
  • 这可能不受支持。我的猜测是,getStringSet() 的返回值不是LinkedHashSet
  • 是的,你是对的。任何想法如何解决这个问题?

标签: java android sharedpreferences hashset linkedhashset


【解决方案1】:

Set set = new LinkedHashSet();

在这一行中,您实例化了一个新的空 LinkedHashSet 对象。然后将该对象分配给名为set 的变量。

set = sharedPref.getStringSet("quotesAndAuthors", null);

在这一行中,您重新分配了set 变量以指向某个其他对象,即您调用getStringSet 返回的某个Set 对象。我们不知道实现Set 接口的第二个对象的具体类。您可以致电getClass 询问。

你的第一组,空的LinkedHashSet,没有使用。由于没有其他引用指向它,该集合成为最终垃圾收集的候选对象。

【讨论】:

  • 感谢您指出这一点。我更改为 set.addAll 并添加了 StringSet。但是问题是“getStringSet()”,因为它混合了来自 LinkedHashSet 的值。有什么想法可以克服这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
相关资源
最近更新 更多