2

set.addAll が注文を切り替えてリストを追加する理由がわかりません。(まだ私のセットは LinkedHashSet として宣言されています)

このコードは、SharedPreferences から Set-List を取得し、それを ArrayList に変換し、1 つの項目をリストに追加してから、リスト全体を Set に追加することに関するものです。

コードは次のようになります。

 Set<String> set = new LinkedHashSet<String>();
 List<String> stringList = new ArrayList<String>();

 ///

 set = getSharedPrefSet("mySet");
 stringList = new ArrayList<String>(set);
 stringList.add(message);
 set.addAll(stringList);  //this messes up my order
 saveSharedPrefSet("mySet", set);

最初の 2 つの文字列は (私がデバッグしたように) 正しく追加されますが、3 番目の文字列は 2 番目の文字列と位置が切り替わります。

出力:

ここに画像の説明を入力

getSharedPrefSet 関数:

Set getSharedPrefSet (String key) {
    sharedPrefs = this.getSharedPreferences("myPreferences", Context.MODE_PRIVATE);

    return sharedPrefs.getStringSet(key, null);
}

回避策

解決策の 1 つは、android で配列の共有設定を作成するコードを作成する方法で見つけることができますか?

4

1 に答える 1

2

私はあなたの問題が何であるかを見ることができます! アイテムの順序を保持することになっている として初期化していますが、その後、次の行を見てsetください。LinkedHashSet

set = getSharedPrefSet("mySet");

メソッドの実装はここには表示されませんgetSharedPrefSetが、提供されたスクリーンショットを見ると、setnowであることがわかりますHashSet。したがって、メソッドは を返したに違いないHashSetため、必要な順序が失われます。これは、HashSetそれが保持されないためです。

のドキュメントからLinkedHashSet:

Set インターフェイスのハッシュ テーブルとリンク リストの実装。反復順序は予測可能です。この実装が HashSet と異なる点は、そのすべてのエントリを実行する二重リンク リストを維持することです。

したがって、ここで実際に行う必要があるのは、実際に別のアプローチを取ることです。set変数を初期化する方法に関係なく、メソッドが返すものによって上書きされるgetSharedPrefSetためです (とにかく初期化は時代遅れです)。それを回避する別の方法を見つけて ください。sharedPrefs.getStringSet明らかに通常の を返しますHashSet

于 2017-01-11T16:31:33.857 に答える