Я должен проверить, совпадает ли элемент массива с предыдущим (java)

#java

Вопрос:

Я последовал совету сайта, но не нашел ответов, которые меня удовлетворили. Мне нужно решить школьное упражнение. У меня есть массив, и мне нужно проверить, есть ли хотя бы последовательность из 3 последовательных символов «а».

 public static String alternative(char[] a) {
    String ret = "";
    int consecutiveCounter = 0;
    int i = 1;
     while(consecutiveCounter<3){
         while(i<= a.length){
             if(a[i] =='a' amp;amp; a[i] == a[i-1] ) {

                consecutiveCounter  ;
            } else {
                consecutiveCounter = 0;
            }
            i  ;
        }
    }

    if (consecutiveCounter == 3) {
        ret  = "there are three consecutive a char";
    } else {
        ret  = "there are not three consecutive a char";
    }
    return ret;

}


public static void main(String[] args) {
    char[] a = new char[]{'a', 'a', 'b', 'c', 'a', 'b', 'a'};
    System.out.println(alternative(a));

}
 

терминал выдает мне это исключение:

Исключение в потоке «основной» java.lang.Исключение ArrayIndexOutOfBoundsException: Индекс 7 выходит за пределы длины 7 в Es1.alternative(Es1.java:9) в Es1.main(Es1.java:31)

Я не могу увеличить значение индекса (i), не выходя за пределы массива

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

1. Тогда… не выходи за рамки дозволенного?

2. поскольку индекс начинается с 0, i он не может совпадать с длиной массива. так что i<a.length()

3. «Я последовал совету сайта, но не нашел ответов, которые меня удовлетворили». — Тогда вам нужно использовать другой подход. Вместо того чтобы искать «совета» (о том, как решить проблему), попытайтесь на самом деле понять, в чем на самом деле заключается проблема. Поймите, что >ваше> Затем выясните, в чем ошибка >вы> В основном… узнайте, как отлаживать свой код.

4. Вот несколько ссылок, которые помогут вам развить свои навыки отладки: Как отлаживать небольшие программы и отладку резиновой утки

5. (или… вы могли бы просто утешить себя, посмотрев это видео 🙂 )

Ответ №1:

Возможно, здесь лучше использовать for циклы, как для проверки границ массива, так и для внутреннего подсчета вхождений 'a' и возврата на ранней стадии, как только будет достигнут требуемый предел:

 public static String alternative(char[] a) {
    for (int i = 0, n = a.length; i < n; ) {
        for (int count = 1; i < n amp;amp; a[i  ] == 'a'; count  ) {
            if (count == 3) {
                return "there are three consecutive 'a' chars";
            }
        }
    }
    return "there are not three consecutive 'a' chars";
}
 

Стоит отметить, что String класс (который в основном построен на массиве символов) имеет несколько методов для реализации этой функции:

  • String::contains : "aabbccaaa".contains("aaa") // true
  • String::indexOf : "aabbccaa".indexOf("aaa") // -1, aaa not found
  • String::matches (используя регулярное выражение): "aabbaaaccaa".matches(".*a{3}.*") // true

Ответ №2:

Кроме того, я не думаю, что ваш внешний цикл будет хорошо работать.
1.Предположим, что последовательного символа нет, тогда consecutiveCounter он останется 0 и while(consecutiveCounter<3) не закончится.
2.Даже если есть один или два, но он будет установлен 0 снова и while(consecutiveCounter<3) не закончится.

Ответ №3:

Вот несколько предложений.

  • Используйте цикл » для » от i = 1 to i < a.length . Тогда i не будет превышать последний индекс массива.
  • Вы пытаетесь найти только 3 подряд 'a's . Поэтому инициализируйте consecutiveCounter значение 1.
  • Как только будет найдена первая последовательная пара, вы увеличите consecutiveCounter ее, и теперь она будет равна 2, что правильно.
  • Затем в том же if clause порядке проверьте, равно ли это значение 3. Если это так, немедленно верните строку (у вас может быть даже 4 или 5 последовательных a's , но у вас также есть 3, поэтому возвращайтесь, когда количество 3 будет найдено впервые.
  • В противном случае, если оператор if завершится неудачно, сбросьте consecutiveCounter значение 1 и продолжите цикл.
  • В конце, вне цикла, верните строку, указывающую, что требование не было выполнено.

Примечание: Если бы вы пытались найти максимальное количество последовательных a's настроек, счетчик 1 не работал бы, потому что у вас может a's вообще не быть. Но так как вы ищете конкретное число == 3, оно отлично работает.