使用java进入这个数组的ArrayIndexOutOfBoundsException?

时间:2014-11-21 09:31:08

标签: java arrays indexoutofboundsexception

我在Java中有一个数组,需要输出只包含重复数字的数字。但是,我的代码会抛出ArrayIndexOutOfBoundsException。问题在哪里?

int[] inputValues= {122, 2, 22, 11, 234, 333, 000, 5555, 8, 9, 99};

for (int i = 0; i < inputValues.length; i++) {
    int numberLength = Integer.toString(inputValues[i]).length();
//  System.out.println(numberLength);
    if (numberLength > 1) { //more than one digit in the number
        String s1 = Integer.toString(inputValues[i]);
        String[] numberDigits = s1.split("");

        for (int j = 1, k = 1; j < numberDigits.length; k++) {
            if (numberDigits[j].equals(numberDigits[k + 1])) {
                System.out.println("Duplicate values are:");
                //I need to print 22,11,333,000,5555,99 
            }
        }
    }
}

6 个答案:

答案 0 :(得分:3)

k变得太大时,没有条件阻止内循环。 j永远不会在内循环中发生变化,因此j < numberDigits.length将始终为true或始终为false。

答案 1 :(得分:1)

这条线是罪魁祸首 -

for (int j = 1, k = 1; j < numberDigits.length; k++) {
    if (numberDigits[j].equals(numberDigits[k + 1])) {
        System.out.println("Duplicate values are:");//i need to print 22,11,333,000,5555,99,etc.
    }
}

循环的条件始终为真,因为j的值始终为1.由于每次迭代k都会继续增加1(这是无限的btw),索引将超出数组边界。

尝试 -

for (int j = 0, k = 1; k < numberDigits.length; k++) {
    boolean isDuplicate = true;
    if (!numberDigits[j].equals(numberDigits[k])) {
        isDuplicate = false;
        break;
    }
}
if( isDuplicate ) {
    System.out.println("Duplicate values are:"+inputValues[i]);
}

答案 2 :(得分:1)

public static void  main(String[] args) {


    int[] inputValues={122,2,22,11,234,333,000,5555,8,9,99,1000};



    System.out.println("Duplicate values are:");
      for (int i = 0; i < inputValues.length; i++) {

          String strNumber = new Integer(inputValues[i]).toString();// get string from array

          if(strNumber.length()>1)  // string length must be greater than 1
          {

              Character firstchar =strNumber.charAt(0);  //get first char of string

              String strchker =strNumber.replaceAll(firstchar.toString(), ""); //repalce it with black



              if(strchker.length()==0)   // for duplicate values length must be 0
              {
                  System.out.println(strNumber);

              }

          }


       }


      /*
       * output will be 
       * Duplicate values are:
        22
        11
        333
        5555
        99
       * 
       * 
       */
}

这就是你想要的......

答案 3 :(得分:1)

很抱歉迟到了。我认为以下是您正在寻找的代码

private int[] getDuplicate(int[] arr) {
        ArrayList<Integer> duplicate = new ArrayList<Integer>();

        for (int item : arr) {
            if(item > 9 && areDigitsSame(item)) {
                duplicate.add(item);
            }
        }

        int duplicateDigits[] = new int[duplicate.size()];

        int index = 0;
        for (Integer integer : duplicate) {
            duplicateDigits[index ++] = integer;
        }
        return duplicateDigits;
    }

    public boolean areDigitsSame(int item) {
        int num = item;
        int previousDigit = item % 10;
        while (num != 0) {
            int digit = num % 10;
            if (previousDigit != digit) {
                return false;
            }
            num /= 10;
        }

        return true;
    }

现在,请按以下方式使用

int[]inputValues={122,2,22,11,234,333,000,5555,8,9,99};
int[] duplicates = getDuplicate(inputValues);

这就是全部

享受!

答案 4 :(得分:0)

    public static void  main(String[] args) {


        String[] inputValues={"122","2","22","11","234","333","000","5555","8","9","99"};



        System.out.println("Duplicate values are:");
          for (int i = 0; i < inputValues.length; i++) {

              String strNumber = inputValues[i];// get string from array
              if(strNumber.length()>1)  // string length must be greater than 1
              {
                  Character firstchar =strNumber.charAt(0);  //get first char of string

                  String strchker =strNumber.replaceAll(firstchar.toString(), "0"); //repalce it with 0

                if(Integer.parseInt(strchker)==0)   //if all values are duplictae than result string must be 0
                {
                  System.out.println(strNumber);
                }

              }


           }

    }
   // /// result will be
 /*  Duplicate values are:
   22 
   11
   333
   000
   5555
   99
*/

如果你想要int数组,那么你将无法获得“000”作为重复值。

答案 5 :(得分:0)

@第13行: s1.split("") 结果为[, 1, 2, 2] 122。因此,numberDigits.length为4.循环从j = 1到3(j numberDigits[k + 1 ]被评估为[, 1, 2, 2]无法使用的索引4。

另一点值得注意的是int [] inputValues总是将000存储为0。

下面提到的方法将采用整数,并根据您的要求返回true和false。它将使用xor运算符来检查重复数字。

private static boolean exorEveryCharacter(int currentValue) {
        int result = 0;
        int previousNumber = -1;

        while (currentValue != 0) {
            int currentNumber = currentValue % 10;

            if(previousNumber == -1){
                previousNumber = currentNumber;
            }
            else{
                result = previousNumber ^ currentNumber;
            }

            currentValue /= 10;
        }
        return result == 0;
    }