2017-01-20 10 views
1

私は過去2時間、次の2つの方法が異なる結果をもたらす理由を理解しようとしています。どちらも整数配列を取り、その中の連続した複製を削除し、削除された各複製の最後に "-1"を入れるメソッドです。ループ内で直接参照の代わりに変数を代入して結果が異なる

方法1は正しい出力を行い、方法2は無限ループに変わります。

//Method 1 
private static void smoosh1(int[] ints) { 

    for (int i=0; i<ints.length-1; i++) { 
     while (ints[i] == ints[i+1] && ints[i] != -1) { 
      for (int x=i; x<ints.length-1; x++) { 
       ints[x] = ints[x+1]; } 
      ints[ints.length-1] = -1; 
      } 
     } 
    } 




//Method 2 
public static void smoosh(int[] ints) { 

    for (int i = 0; i < ints.length - 1; i++) { 

     int curVal=ints[i]; 
    int nextVal=ints[i+1]; 

     while (curVal == nextVal && curVal !=-1) { 

      for (int x = i; x < ints.length-1; x++) { 
       ints[x] = ints[x + 1]; 

      } 
      ints[ints.length-1] = -1; 
     } 
     } 

ループ内の変数を宣言すると出力に影響する理由を教えてください。ありがとう。

注意: - この問題は、バークレーのMOOC 61Bの第1部、宿題3に記載されています。 リンク: - https://people.eecs.berkeley.edu/~jrs/61b/hw/hw3/第スニペットはwhileループが各反復でcurValnextValの値を変更する必要があり、最初のスニペットと同様に動作するために

+1

CURVALとnextValNever変更をそうCURVAL 'の出力== nextValは&& CURVAL = - 1 '常に同じです!。あなたの場合は「真」です。 – NewUser

+0

実際、 'while 'の代わりに' if'が必要なことがあるので、 'while(curVal == nextVal && curVal!= - 1)'を 'if(curVal == nextVal && curVal!= - 1) 'はコードのトリックをする必要があります... –

答えて

0

:それ以外の場合

public static void smoosh(int[] ints) { 
    for (int i = 0; i < ints.length - 1; i++) { 
     int curVal=ints[i]; 
     int nextVal=ints[i+1]; 
     while (curVal == nextVal && curVal !=-1) { 
      for (int x = i; x < ints.length-1; x++) { 
       ints[x] = ints[x + 1]; 
      } 
      ints[ints.length-1] = -1; 
      curVal=ints[i]; 
      nextVal=ints[i+1]; 
     } 
    } 
} 

のvaule式curVal == nextVal && curVal !=-1は常に同じままで、whileループは決して実行しないか、決して終了しません。

0

whileループ(連続した複製が配列にあります)に入ると、curValとnextValは決して変更されないので、決して出てこないでしょう。 は、私はあなたがこのようなデバッグ行書くことsuugest:whileループで

//Method 2 
public static void smoosh(int[] ints) { 

    for (int i = 0; i < ints.length - 1; i++) { 

     int curVal=ints[i]; 
    int nextVal=ints[i+1]; 

     while (curVal == nextVal && curVal !=-1) { 
System.out.println(curVal + " "+ nextVal); 

      for (int x = i; x < ints.length-1; x++) { 
       ints[x] = ints[x + 1]; 

      } 
      ints[ints.length-1] = -1; 
     } 
     } 
関連する問題