0

2つのArrayListがあり、1つはStringsを含み、もう1つはsを含みIntegerます。のlist2要素のインデックスが含まれていますlist1

list1次に、インデックスがにあるすべての要素を削除する必要がありますlist2。何か案は?

ArrayList<String> list1 = new ArrayList<String>(); 
list1.add("a");
list1.add("b");
list1.add("c");
list1.add("d");
list1.add("e");
list1.add("f");

ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(1);
list2.add(4);
list2.add(2);

list1ここでの問題は、インデックスが変更され続けるため、元のファイルから削除できないことです。HashMap配列のインデックスとStringリレーションを格納するための一時を作成してみました。

繰り返してlist2マップします。一致するkey=indexを見つけたとき、それをスキップしました。それ以外の場合は、String要素を新しいリストに追加します。

より良い提案はありますか?

4

4 に答える 4

4

で指定された最高のインデックスからアイテムを並べ替えlist2て削除します。そうすれば、他の関連するインデックスは変更されません。list1list2list1

あなたはこのようにそれを行うことができます:

    Collections.sort(list2, Collections.reverseOrder());
    for (Integer i : list2) {
        list1.remove((int) i);
    }

編集:

David Wallaceがコメントで指摘しているように、上記のアプローチは、に重複がない場合にのみ機能しlist2ます。上記のコードの前に次の行を追加することで、重複を取り除くことができます。

list2 = new ArrayList<>(new HashSet<>(list2));
于 2012-12-15T12:56:49.270 に答える
3

このソリューションは、nullがの有効な値ではないことを前提としていますlist1

を繰り返すことができlist2、到達するインデックスごとに、対応する値list1をnullに設定します。次に、最後からすべてのnullを削除しlist1ます。list2これは、jlordoのソリューションでは困難な重複要素がある場合でも機能します。

for(Integer index : list2){
    list1.set(index,null);
}
list1.removeAll(Collections.singleton(null));
于 2013-01-25T23:00:15.130 に答える
0

挿入順序だけが気になる場合はLinkedHashMap、これに適した作業のようなものです。ただし、インデックスを決定するには、必要な要素が見つかるまでリストを反復処理する必要があります。

int n = 0;
for (String value : linkedMap) {
  if (value.equals(valueToSearch)) {
    break;
   }
   ++n;
}
// n == index now

インデックスが頻繁に必要な場合は、おそらく2つのマップが必要です。1つはindexe->Stringを保持し、もう1つはString->indexを保持します。両方のマップを同時に挿入および削除するようにしてください。

于 2012-12-15T13:07:28.603 に答える
-3

コード内のBaseAdapterおよびgetView()メソッドに使用され、特定のonClickListner実装を書き留めて、このコードを試してみてください。

mArrayList.remove(position);
notifyDataSetChanged();
于 2012-12-15T12:58:12.550 に答える