2017-01-31 6 views
1

このメソッドの役割は、配列から値を削除することです。残りの要素は、配列の先頭に移動するだけです。配列のサイズは変更されません。最後の要素の位置は1つ少なくなります。最後の要素の位置は0で埋めてください。配列に複数のtoRemoveがある場合、最初のオカレンスだけが除去される。このメソッドには戻り値がありません。配列に要素がない場合は、何も効果がありません。Javaでのこのremoveメソッドのロジックの理解

ソリューション:

public static void remove(int[] arr, int toRemove) { 
    boolean done = false; 
    int position = 0; 
    for(int pos = 0; pos < arr.length; pos++) { 
     if(!done && arr[pos] == toRemove) { 
      done = true; 
      position = pos; 
     } 
     if(done) { 
      for(int i = position + 1; i < arr.length; i++) { 
       arr[i - 1] = arr[i]; 
      } 
      arr[arr.length -1] = 0; 
     } 
    } 
} 

私はこのアルゴリズムがどのように動作するか、次のではないのです。ブール値を使用すると私は混乱します。私はプリミティブデータ型が何をしているのか完全に理解していないと感じています。しかし、それはどういう意味ですか?私はブール値を理解していません。 私はtoRemove値が見つかった場所のインデックスのintプレースホルダーが必要な理由を理解します。 forループを使用してインデックスとそれぞれの値を1つずつ繰り返し、正確にtoRemoveが見つかる場所を特定することが望ましいと私は理解しています。したがって、私はいくつかの任意のインデックスでtoRemove値が存在する場合、我々は条件付きのチェックポイントを見たいと思う理解し、そしてd:!

if(arr[pos] = toRemove) // then bingo we've found him 

私はブール行われ、ブールが私を混同し理解していません。 なぜこのチェックポイントは完了したのですか?その後、もう一度チェック(完了)?なぜループfor(int i = position + 1; i < arr.length; i ++)を呼び出し、そのあとにループarr [i - 1] = arr [i];?最終的にarr [arr.length-1] = 0およびposition = posになります。

私はvariablenameOfArrと書かれた特定のindiciesの値にアクセスしたいとき、[]をボックスの中に入れます。私はこれをすべてまとめるのが難しいです。

はあなたにこの場合

+0

は、このコードを削除することをあなたは確かにあります値の最初の出現のみ?値が複数回表示される場合は、複数の要素が削除されるように見えます(最初の要素の後に、必ずしも一致する要素とは限りません)。 'if(done)'ブロックの最後に 'return;'ステートメントがないかもしれませんか? –

+0

'if(arr [pos] = toRemove)'注意:これはコードが言うことではなく、どちらも有効ではありません(これは代入であり、比較ではありません)。 –

+0

インデントを修正するコードを編集しました。以前はとても混乱していました。正しい字下げは、コードをよりよく理解するのに役立ちます。 –

答えて

0
 public static void remove(int[] arr, int toRemove) { 
      boolean done = false; //This boolean is used to determine when the element has been found 
      int position = 0; 
       for(int pos = 0; pos < arr.length; pos++) { //Iterating through the array 
    //if we aren't already done, (!done = NOT DONE) and we have found the position to remove, then enter this logic 
       if(!done && arr[pos] == toRemove) { 
        done = true; //since we found the position to remove, set done to true 
        position = pos; //Save the index of the one that was removed 
       } 
       if(done) { //if we are done, enter this logic 
//This loop starts above the index where removed, and iterates to the top 
        for(int i = position + 1; i < arr.length; i++) { 
        arr[i - 1] = arr[i]; //This shifts each element down one 
       } 
       arr[arr.length -1] = 0; //This sets the empty slot at the top of the array to 0 
       } 
      } 
     } 
0

ありがとう、行わブール値が既に削除されているか否かを制御するようです。まだ何も削除されていないので、アルゴリズムはfalseとして開始されます。

最初のif文は、doneの値がfalseであるかどうかをテストします。 if文では、if(done == false)というより、if(!done)に簡略化することができます。したがって、このif文は、値が見つかったかどうかを調べるだけです。

doneは、値が削除されるとtrueに設定されるため、将来の値は削除されません。

最後に、2番目のif文は、値が削除されたかどうかを調べるためにテストします。最初のif文と同様にif(done == true)をif(done)に簡略化することができます。

私はこれが助けてくれることを願っています。

0

if(!done && arr[pos] == toRemove)がtrueの場合、常にtrueであるため、ブール値は実際には必要ありません。
さらに、要素を削除したときに、外側のループに行くのは意味がありません。1)配列の状態がいいことです。内側のループは、削除された要素の後に要素を左に移動しました.2) 2回の削除を実行します。

ところで、position変数も必要ありません。 pos変数は、読み込み専用としてそのまま使用することができます。

このコード:

for(int pos = 0; pos < arr.length; pos++) { 

    if(!done && arr[pos] == toRemove) { 
     done = true; 
     position = pos; 
    } 
    if(done) { 
     for(int i = position + 1; i < arr.length; i++) { 
     arr[i - 1] = arr[i]; 
     } 
     arr[arr.length -1] = 0; 
    } 
} 

はブール値を使用せずに、この置き換えることができると配列要素をシフトした後、あなたが方法をも存在する可能性:

for(int pos = 0; pos < arr.length; pos++) { 

    if(arr[pos] == toRemove) { 
     for(int i = pos + 1; i < arr.length; i++) { 
     arr[i - 1] = arr[i]; 
     } 
     arr[arr.length -1] = 0;   
     return; 
    } 

    } 
関連する問題