#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, оно отлично работает.