LinkedHashSet не основной порядок вставки? - PullRequest
1 голос
/ 18 января 2020

В настоящее время я создаю приложение Android, в котором отображаются цитаты известных людей. У меня есть домашний экран и 2 других экрана, на которых я отображаю все цитаты, а на другом - любимые цитаты.

Таким образом, когда я нажимаю кнопку «Мне нравится» на экране AllQuotesActivity, цитата и автор будут сохранены в LinkedHashSet, который будет сохранен в SharedPreferences, поэтому моя активность FavouriteQuotes может получить данные. Я могу получить данные, но данные смешаны, хотя другие ссылки говорят, что LinkedHashSet поддерживает порядок вставки. Может я что то не так сделал. Вот важные фрагменты кода:

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();
}

}

FavouriteQuotesActivity. 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 Я регистрирую набор для проверки его значений. Лог-выходы и выходы на экране одинаковы, оба несортированы одинаково.

1 Ответ

0 голосов
/ 18 января 2020

Set set = new LinkedHashSet ();

В этой строке вы создаете новый пустой LinkedHashSet объект. Затем этот объект был присвоен переменной с именем set.

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

В этой строке вы переназначили переменная set, указывающая на некоторый другой объект, некоторый объект Set, возвращаемый вашим вызовом getStringSet. Мы не знаем конкретный класс этого второго объекта, который реализует интерфейс Set. Вы можете спросить, позвонив getClass.

Ваш первый сет, пустой LinkedHashSet, не использовался. Без других ссылок, указывающих на это, этот набор стал кандидатом на возможную сборку мусора.

...