LinkedHashSet не является основным порядком вставки?

В настоящее время я создаю приложение для 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();
}

}

ИзбранноеQuotesActivity.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 я регистрирую набор, чтобы проверить его значения. Выводы журнала и вывод на экран одинаковы, оба не отсортированы одинаково.


person Community    schedule 18.01.2020    source источник
comment
Было бы полезно, если бы вы могли сократить это до простого блока кода, который создает экземпляр связанного набора хэшей, добавляет некоторые данные и выполняет итерацию по набору.   -  person David    schedule 18.01.2020
comment
Спасибо за подсказку, убрал ненужный код   -  person    schedule 18.01.2020
comment
Это, вероятно, не поддерживается. Я предполагаю, что возвращаемое значение из getStringSet() не является LinkedHashSet.   -  person greeble31    schedule 18.01.2020
comment
Да, вы правы. Любые идеи, как обойти это?   -  person    schedule 19.01.2020


Ответы (1)


Установить set = новый LinkedHashSet();

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

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

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

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

person Basil Bourque    schedule 18.01.2020
comment
Спасибо что подметил это. Я изменил на set.addAll и добавил StringSet. Однако проблема заключается в том, что getStringSet() смешивает значения из LinkedHashSet. Любые идеи, как это преодолеть? - person ; 19.01.2020