0

50 個の RANDOM 整数の配列リストがあります。ユーザーに番号を削除するように依頼すると、その番号の出現箇所がすべてリストから削除されます。私はそれを使ってそれをしました

while (randInts.contains(removeInt) )
{
  if (randInts.get(i) == removeInt)                 
   randInts.remove(randInts.get(i));
   i++;             

 } 

 System.out.println("\n" + randInts.toString());
 System.out.println("\n" + randInts.size());`

問題の別の部分は、ユーザーに別の番号を入力するように求めることです。上から削除された番号は、2 番目のプロンプト番号が出現するたびに挿入されます。IndexOutOfBoundsException が発生し続けるため、2 番目の部分で問題が発生しています。

4

8 に答える 8

1

LinkedList代わりにaを使用してください。順序通りのトラバーサルが必要であるが実際にはランダム アクセスは必要ない場合、およびリストの途中で要素を挿入および削除する必要がある場合は、はるかに優れた選択です。

リストの反復子を単純にトラバーサルするだけで、必要なこと ( のすべてのインスタンスを削除し、 のすべてのインスタンスの後にremoveInt挿入する) を実現できます。removeIntinsertAfterInt

ListIterator<Integer> li = randInts.listIterator();
while(li.hasNext()) {
    int i = li.next();
    if(removeInt == i)     // assumes removeInt is an int; use equals() for Integer
        li.remove();
    if(insertAfterInt == i)
        li.add(removeInt);  // the iterator will skip this element, so it won't get removed
}
于 2013-09-17T21:42:22.477 に答える
1

2 つの大きな問題が見られます。何にもバインドiされていないことと、n^2 ループを記述したことです (これは線形時間で実行できます)。

進むにつれて `List` のサイズを縮小しています...次の簡単な例を見てください:

のすべてのインスタンスを削除したいとします。5

次のようなリストが与えられた場合{1,2,3,5,5}

i = 3 の場合、最初の 5 つを削除すると、リストは次のようになります。{1,2,3,5}

次に、i = 4 の要素を削除しようとしますが、削除したい要素は実際には i = 3 にあるため、IndexOutOfBoundsException

`contains` を使用しないでください。ループの最悪の場合のパフォーマンスが n^2 に拡張されるため、これはより高速になります。

int size = randInts.size() - 1;
for (int i = size; i >= 0; i--){
   if (randInts.get(i).equals(removeInt))
       randInts.remove(i);
}
于 2013-09-16T20:47:52.547 に答える
0

これは n^2 ですが、動作するはずです

int i = 0;

    while(i < loFnumbers.size()){
        if(loFnumbers.get(i) == removeInt){
            loFnumbers.remove(i);
            continue;
        }
        i++;

    }
于 2013-09-16T21:14:21.010 に答える
0
while (randInts.contains(removeInt) )
{

   if(i<randInts.size());
    {
  if (randInts.get(i) == removeInt)                 
   randInts.remove(randInts.get(i));
     }//if
   i++;             

 }while
于 2013-09-16T20:48:37.333 に答える
0
if (randInts.get(i) == removeInt)                 
randInts.remove(randInts.get(i));
i++;  

停止条件を確認することはありません。修正は次のとおりです。

while (randInts.contains(removeInt) )
{
    i=0;
   while(i<randInts.size()){

  if (randInts.get(i) == removeInt)                 
   randInts.remove(randInts.get(i));
   i++;             
}
 } 
于 2013-09-16T20:47:09.997 に答える
0

これは、状態の変化を回避する (つまりrandInts、決して変更されない)アプローチです。

package so;

import java.util.ArrayList;

public class SO_18836900 {

  public static void main(String[] args) {

    // build a collection of random ints
    ArrayList<Integer> randInts = new ArrayList();
    for (int i = 0; i < 50; i ++) {
      randInts.add((int)(Math.random() * 5));
    }

    // create a collection with all 3s filtered out
    ArrayList<Integer> filtered = filterOut(randInts, 3);
    System.out.println(filtered);
    System.out.println(filtered.size());

    // create a collection with a 99 inserted after each 4
    ArrayList<Integer> insertedAfter = insertAfter(randInts, 4, 99);
    System.out.println(insertedAfter);
    System.out.println(insertedAfter.size());

  }

  static ArrayList<Integer> filterOut(Iterable<Integer> xs, int toRemove) {
    ArrayList<Integer> filteredInts = new ArrayList();
    for (int x : xs) {
      if (x != toRemove) filteredInts.add(x);
    }
    return filteredInts;
  }

  static ArrayList<Integer> insertAfter(Iterable<Integer> xs, int trigger, int toInsert) {
    ArrayList<Integer> insertedAfter = new ArrayList();
    for (int x : xs) {
      insertedAfter.add(x);
      if (x == trigger) insertedAfter.add(toInsert);
    }
    return insertedAfter;
  }

}
于 2013-09-16T21:34:03.610 に答える
0

50 個のアイテム ( ) のコレクションから始めて、randIntsユーザーが入力したアイテム ( ) を削除していると思いますiか?

その場合、アイテムを削除すると、コレクションは 49 個のインデックスだけが残り、インデックスをget取得します。次のようなものを試してください...

if (randInts.contains(i)){
     randInts.remove(randInts.indexOf(i));
}
于 2013-09-16T20:52:40.247 に答える
-1

参照を比較している「整数」に == を使用しないでください。
int にボックス化解除するか、使用しますequals(

于 2013-09-16T20:45:17.107 に答える