2016-10-27 12 views
1

連続した数字の配列を作成する方法に問題があります(つまり、引数として1と10を入力すると、配列には1〜10のすべての数値が入ります)各数字を別の数字(例えば4)にする - 数字が一致する場合(例えば4 == 4)、配列からその数字を削除する。最後に、その配列を返します。数字の省略方法バグ

私は時々動作するが以下の方法を実装しましたが、すべての時間ではありません。理由はわかりません。私は新しい配列を作成し、各アレイを印刷した場合

たとえば、:

ArrayList<Integer> omittedDigitArray = new ArrayList<Integer>(Omit.allIntegersWithout(20, 45, 3)); 

     System.out.println("Array - Numbers with Omitted Digit:"); 
     for (int n : omittedDigitArray) { 
      System.out.print(n + ", "); 
     } 

番号29は、配列から省略されていますか?誰でも私になぜ教えてもらえますか?ありがとう!

// Creates the ArrayList 
    ArrayList<Integer> numberList = new ArrayList<Integer>(); 

    // Loop creates an array of numbers starting at "from" ending at "to" 
    for (int i = from; i < to + 1; i++) { 
     numberList.add(i); 
    } 

    // Check the array to see whether number contains digit 
    // Code checks whether x contains 5, n == one digit 

    // IMPORTANT: Doesn't work on the first half of numbers i.e/will remove 3 but not 30 
    for (int j = 0; j < numberList.size(); j++) { 

     int number = (int) numberList.get(j);   // This can be any integer 
     int thisNumber = number >= 0 ? number: -number; // if statement in case argument is negative 
     int thisDigit; 

     while (thisNumber != 0) { 

      thisDigit = thisNumber % 10; // Always equal to the last digit of thisNumber 
      thisNumber = thisNumber/10; // Always equal to thisNumber with the last digit chopped off, or 0 if thisNumber is less than 10 

      if (thisDigit == omittedDigit) { 
       numberList.remove(j); 
       j--; 
      } 
     } 
    } 

    // Return the completed Array list 
    return numberList; 
} 

}

+0

あなたがリストから項目を削除しているとき、あなたはリストを逆方向に反復する必要があります。そうすれば、リストインデックスカウンタを調整する必要はありません。また、あなたの指示は数字が数字の中にあるかどうかは言いません。あなたの指示は、数字が一致するかどうかを示します。 –

答えて

0

あなたの内側のループに問題があります。リストから要素を削除したら、そのループを解除する必要があります。それ以外の場合は、無関係な追加番号を削除することがあります(省略された数字が同じ番号に複数回現れる場合)。

while (thisNumber != 0) { 

     thisDigit = thisNumber % 10; // Always equal to the last digit of thisNumber 
     thisNumber = thisNumber/10; // Always equal to thisNumber with the last digit chopped off, or 0 if thisNumber is less than 10 

     if (thisDigit == omittedDigit) { 
      numberList.remove(j); 
      j--; 
      break; // add this 
     } 
    } 

Iは1〜50の範囲であなたのコード(+私の修正案)を走り、桁4を省略して得た:

[1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 50] 

44が処理されているとき、あなたのコードに問題が発生しました - あなたがそれを取り除いた後(最初の4つのために、あなたはwhileループを続け、別の4つを見つけ、40から43までの数字がすでに削除されているので、別の数字を削除します。

0

私の対処法:

ArrayList<Integer> numberList = new ArrayList<Integer>(); 

// Loop creates an array of numbers starting at "from" ending at "to" 
    for (int i = from; i < to + 1; i++) { 
     numberList.add(i); 
    } 
//removing all numbers that contain the digit 
    numberList.removeIf(j->containsDigit(j,thisDigit)); 
    return numberList; 
} 

boolean containsDigit(int number,int thisDigit){ 
    //making sure thisDigit is positive 
    thisDigit=Math.abs(thisDigit) 

    //if thisDigit is not a digit result is false 
    if(thisDigit>=10) return false; 

    //breaking the number into its digits 
    List<Integer> digits=new ArrayList<Integer>(); 
    while(number>0){ 
     digits.add(number%10); 
     number=(int) number/10; 
    } 

    return digits.contains(thisDigit); 
} 
関連する問題