4

配列リストを検索して値 (再発する可能性があります) を見つけ、その値のすべてのインスタンスを削除しようとしています。また、同じ場所にある値を別の配列リストから削除したいと思います。ArrayList は両方ともArrayList<String>.

たとえば、ArrayList2 で数字の 5 を探しています。

ArrayList 1       ArrayList2
cat               1
pig               2
dog               5
chicken           3
wolf              5

両方の場所で 5 という数字を見つけたら、ArrayList1 から犬と狼を削除したいと思います。私のコードにはエラーはありませんが、私が求めているものを実際に削除しているようには見えません。

//searching for
String s="5";
//for the size of the arraylist
for(int p=0; p<ArrayList2.size(); p++){
 //if the arraylist has th value of s
 if(ArrayList2.get(p).contains(s)){
   //get the one to remove
   String removethis=ArrayList2.get(p);
   String removetoo=ArrayList1.get(p);
   //remove them
   ArrayList2.remove(removethis);
   ArrayList1.remove(removetoo);
  }
}

arrayLists を印刷すると、ほとんど変更されていないように見えます。私が間違っていることを誰かが見ていますか?

4

8 に答える 8

11

ループと配列からのアイテムの削除の両方を行っている場合、作成したアルゴリズムは正しくありません。これは、削除するたびに次のアイテムをスキップするためです (p をインクリメントする方法が原因です)。この代替案を検討してください。

int s = 5;
int idx = 0;

while (idx < ArrayList2.size())
{
   if(ArrayList2.get(idx) == s)
   {
     // Remove item
     ArrayList1.remove(idx);
     ArrayList2.remove(idx);
  }
  else
  {
    ++idx;
  }
}
于 2012-08-24T14:27:46.613 に答える
3

コレクションを反復処理して同じコレクションの要素を削除する場合は、次のように を使用する必要がありますIterator

List<String> names = ....
List<Integer> numbers = ....
int index = 0;
Iterator<String> i = names.iterator();
while (i.hasNext()) {
   String s = i.next(); // must be called before you can call i.remove()
   if (s.equals("dog"){
       i.remove();
       numbers.remove(index);
   }
   index++;
}

編集

あなたの場合、変数を手動でインクリメントして、他のリストからアイテムを削除できるようにする必要があります。

于 2012-08-24T14:24:43.863 に答える
1

2 つの反復子を使用できます。

Iterator<String> i1 = arrayList1.iterator();
Iterator<Integer> i2 = arrayList2.iterator();
while (i1.hasNext() && i2.hasNext()) {
  i1.next();
  if (i2.next() == s) {
    i1.remove();
    i2.remove();
  }
}

まだ指摘されているように、おそらく地図を使用する方が簡単でしょう.

于 2012-08-24T14:31:48.553 に答える
0

私はマコトに同意します.Mapを使用するとより有益かもしれません. ArrayList2 の値のみを使用して検索する場合は、1 つのキーに対して複数の値があります。たとえば、5 は犬とオオカミを表します。このために、キーに値のリストを追加できます - 5.

HashMap aMap = HashMap();

ArrayList key5 = new ArrayList();

key5.add("dog");
key5.add("wolf");

aMap.put(5, key5);

したがって、5 のすべての値を削除する必要がある場合は、次のようにします。

aMap.remove(5);

そして、犬とオオカミを含むリストを削除します。

于 2012-08-24T14:49:09.363 に答える
0

contains メソッドが 2 つのオブジェクトを比較していると思います。ただし、オブジェクト "s" は ArrayList 内のオブジェクトとは異なります。型付き配列 (ArrayList など) を使用し、オブジェクト自体ではなく、各オブジェクトの値を比較する必要があります ...

于 2012-08-24T14:26:40.653 に答える
0

ArrayList のindexOf()メソッドをチェックしたいかもしれませんが、リストの要素を反復しながらリストから削除するときは注意が必要です。

于 2012-08-24T14:30:16.160 に答える
0

次のようにリストを宣言する必要があります-

List<String> list1 = new ArrayList<String>();
//...
List<Integer> list2 = new ArrayList<Integer>();
//...

メソッドの代わりにcontainsメソッドを使用しますequals

また、リストを繰り返しながら削除するにはIterator、次のように取得できます-

Iterator<String> it1 = list1.iterator();
Iterator<Integer> it2 = list2.iterator();

//...
于 2012-08-24T14:27:39.093 に答える
0

簡単な解決策は次のとおりです。

List<Integer> origNums = new ArrayList<Integer>(nums);
Iterator<String> animalIter = animals.iterator();
Iterator<Integer> numIter = nums.iterator();

while (animalIter.hasNext()) {
    animalIter.next();

    // Represents a duplicate?
    if (Collections.frequency(origNums, numIter.next()) > 1) {

        // Remove current element from both lists.
        animalIter.remove();
        numIter.remove();
    }
}

System.out.println(animals); // [cat, pig, chicken]
System.out.println(nums);    // [1, 2, 3]
于 2012-08-24T14:32:28.733 に答える