省略数字方法错误

时间:2016-10-27 11:43:43

标签: java arrays while-loop

我遇到了创建连续数字数组的方法的问题(例如,如果输入1和10作为参数,数组将包含1-10中的每个数字),然后比较每个数字到另一个数字(例如4) - 如果数字匹配(例如4 == 4),则它从数组中删除该数字。最后它返回该数组。

我已经实施了下面有效的方法,但不是所有的时间,我不知道为什么?

例如,如果我创建了一个新数组并打印了每个数组:

<div class="fullscreen table-cell valign-middle text-center">
  <input type="file" />
</div>

数组中省略了数字29?谁能告诉我为什么好吗?谢谢!

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 + ", ");
        }

}

2 个答案:

答案 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
        }
    }

我运行了你的代码(+我建议的修复),范围是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个并删除另一个数字,恰好是39,因为数字40已经删除了43个。)

答案 1 :(得分: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);
}