2

リスト ビューの作成に使用しているカスタム アダプタに複数ArrayList<String>の が「リンク」されています。簡単にするために、合計で 2 つだけだとします。リストの一貫性を維持するために、それらの1つを並べ替えてから、この新しい順序を他の順序に反映させたいと思います。

これは私がやろうと思っていたことであり、動作しませIndexOutOfBoundsException: Invalid index 0, size is 0*

// initial declarations:
List<String> filenameEntries = new ArrayList<String>();
List<String> idEntries = new ArrayList<String>();

/* various operations that fill
the two ArrayList here... */

// sorting:
List<String> oldFilenameEntries = new ArrayList<String>();
List<String> oldIdEntries = new ArrayList<String>();

oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;

idEntries.clear();

Collections.sort(filenameEntries);

for (int i = 0; i < filenameEntries.size(); i++ ) {
    for (int j = 0; j < oldFilenameEntries.size(); j++ ) {
        if (oldFilenameEntries.get(j) == filenameEntries.get(i)) {
            idEntries.add(oldIdEntries.get(j));  // *
        }
    }
}

私の考えは、新しいものからすべての要素について古いArrayListを検索し、この「古い」インデックスを使用して他のArrayListを再生成することでした。

(他の「ソートされた」 ArrayList が再びでなければならないという制限がありますidEntries。これが、この種の転送を行った方法です)

なにか提案を?ありがとう。

編集: 並べ替えの問題だと思ったのですが、ArrayLists のコピーを作成する正しい方法を逃したことがわかりました。エラーがあったことを指摘してくれたすべての人に感謝します

oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;

なぜ。

解決策をより迅速に指摘する答えを受け入れました。上記の2行を削除し、前のものを次のように変更しました

List<String> oldFilenameEntries = new ArrayList<String>(filenameEntries);
List<String> oldIdEntries = new ArrayList<String>(idEntries);

私が見る限り、ATM はすべて期待どおりに機能しているようです。

4

4 に答える 4

3

問題は割り当てです。oldIdEntries = idEntries;これにより、両方の参照が同じリストを指すようになるため、そうすると、idEntries.clear();両方が指している1つのリストがクリアされます。参照を割り当てるだけでなく、リストのコピーを作成する必要があります。

Collections.copy

Lists.copy

ImmutableList.copy()

于 2013-09-12T16:29:41.520 に答える