как исправить метод, который работает только с четными индексами?

#java

Вопрос:

я написал этот метод , который проверяет , есть ли цифра, содержащаяся внутри номера индекса следующего массива, если есть хотя бы 1 цифра, которая является частью следующего числа, она попадет в счетчик, и если значение счетчика больше 0, оно попадет в переменную «проверка», которая будет равна true.
достаточно иметь 1 индекс, который является ложным, чтобы сделать весь массив ложным. все они должны быть правдой;

например, массив, который является правильным в соответствии с методом, который я построил: int [] arr = {12,527,71,114,49,1902};

это для объяснения метода. теперь о моей проблеме. метод работает только с четными числами, и я не знаю, что может сработать. спасибо всем помощникам!

 public static boolean checkSpecialArray(int[] arr)
    {
        int i = 0;
        int j = 0;
        int x = 0;
        boolean check = true;
        int counter = 0;
        for (i = 0; i < arr.length; i  )// array's length
        {String Dig = Integer.toString(arr[i  ]);//next array's number
        String num = Integer.toString(arr[i]);//first array's number
            for (j = 0; j < num.length(); j  )// check first array's index number
                for (x = 0; x < Dig.length(); x  )// check 2nd array's index number
                    if (Integer.parseInt(""   num.charAt(j)) == Integer.parseInt(""   Dig.charAt(x)))//checks a digit to another digit
                        counter  ;
                    
            if(counter>0)
            check = true;
                else if(counter==0)
                 return false;
            
            counter=0;  
        }
        if(check)
            return true;
        
        return false;
    } 
 

Комментарии:

1. Что он делает с нечетными числами?

2. Примечание: вместо Integer.parseInt("" num.charAt(j)) == Integer.parseInt("" Dig.charAt(x)) этого num.charAt(j) == Dig.charAt(x)) должно быть достаточно, так как вы хотите проверять символы/цифры, а не значения.

Ответ №1:

Я должен был бы догадаться здесь, но я предполагаю, что это источник вашей проблемы:

  for (i = 0; i < arr.length; i  ) { // array's length 
   String Dig = Integer.toString(arr[i  ]);//next array's number
 

Здесь вы i также увеличиваетесь внутри цикла, поэтому он пропускает числа. Вы, вероятно, хотели бы сделать Integer.toString(arr[i 1]) это вместо этого.

Обратите внимание , что i в основном это то же самое, что i = 1 или i = i 1 , поэтому наличие этого в «следующей» операции вашего цикла (3-я часть конструкции for), а также в теле в основном заставляет тело цикла начинаться с индексов 0, 2, 4 и т. Д. который, похоже, использует только четные индексы.

Кроме того, наличие String num = Integer.toString(arr[i]); во второй строке в основном использует «следующий» номер, а не первый.

Наконец i < arr.length; , это вызовет проблемы для массивов нечетной длины, потому что в теле вы попытаетесь получить доступ к несуществующему индексу в конце (из-за этого i , но даже a i 1 вызовет это).

Зачем вам это нужно (в соответствии с вопросом в вашем комментарии)?

Так как вы пытаетесь сравнить числа по индексам i , и i 1 вам нужно убедиться, что i они не «покидают» массив, т. е. максимально допустимым был бы индекс array.length - 2 . Это связано с тем, что индексы основаны на нуле, поэтому последним допустимым индексом для массива будет array.length - 1 (например, 4 в массиве длины 5).

Теперь давайте рассмотрим варианты для условия цикла:

  • i<arr.length — это позволило i бы ссылаться на последний индекс в массиве и, следовательно arr[i 1] , было бы за пределами, следовательно, вы получили исключение
  • i<=arr.length — это позволило i бы еще больше выйти за рамки и arr[i] уже потерпело бы неудачу
  • i<arr.length-1 — это будет ограничиваться i только ссылками на индексы до предпоследнего (например, индекс 3 в массиве длиной 5) и, следовательно arr[i 1] , все равно будет находиться в пределах и ссылаться на последний элемент.

Таким образом, вы хотели бы, чтобы цикл выглядел так:

 //from first to second-to-last index
for (i = 0; i < arr.length - 1; i  ) {
  String num = Integer.toString(arr[i]);//first array's number

  //also note the lowercase variable name which is more according to the Java code conventions
  String dig = Integer.toString(arr[i 1]);//next array's number
 

В качестве альтернативы вы можете использовать расширенный цикл for, например, такой:

  String prev = null;

 for( Integer num : arr ) {
   //or use Math.abs(num) to also be able to handle negative integers easily
   String next = Integer.toString(num);

   //only if there was a previous number
   if( prev != null ) {
     //compare digits/characters here
   } 

   //keep reference to the "current" number in string form to act as previous in the next iteration
   prev = next;
 }
 

Комментарии:

1. разве это не одно и то же? i = i 1? и это не будет работать так, как вы предлагали ( i 1 )

2. @avihu24 нет, i в основном это то же i = i 1 самое, что и .

3. теперь это вообще не будет работать , исключение в потоке «main» java.lang. Исключение ArrayIndexOutOfBoundsException: 6 в test_2.checkSpecialArray(test_2.java:141) в home.main(home.java:14)

4. @avihu24 да, этого следовало ожидать, так как у вас также есть еще одна ошибка. Посмотрите на обновленный ответ, я уже обращался к этому вопросу.

5. что касается нижнего регистра , я использую только цифры , должен ли я переключаться между строками dig и num ?