Проверка последовательно повторяющихся символов в java - PullRequest
0 голосов
/ 26 января 2020

Я новичок в java. Мне интересно, можно ли проверить определенное количество последовательно повторяющихся символов («определенное число» определяется пользователем) в строке или индексе в строковом массиве. До сих пор я пробовал

int multiple_characters = 0;
String array1 [] = {"abc","aabc","xyyyxy"};
for (int index = 0; index < array1.length;i++){
   for (int i = 0;i<array1[index].length;i++){
      if (array1[index].charAt(i) == array1[index].charAt(i+1)){
         multiple_characters++;
      }
   }
}

Но с этим я получаю ошибку StringIndexOutOfBounds. Я попытался исправить это, добавив дополнительный оператор if, чтобы убедиться, что я не равен array1[index].length, но это все равно вывело ту же ошибку. Кроме ручного и отписанного метода:

if ((array1[index].charAt(i) == array1[index].charAt(i+1) && (array1[index].charAt(i) == array1[index].charAt(i+2))

и повторения, однако много раз (что не было бы здорово для быстрых изменений в моем коде), я не могу найти решение.

Ответы [ 3 ]

2 голосов
/ 26 января 2020

Для внутреннего значения для l oop (с переменной i) вы затем вызываете string.charAt(i+1), где i i делает цикл от 0 до длины этой строки.

Неудивительно, что вы получаете индексный массив за пределами исключения, вы запрашиваете символ ПОСЛЕ последний.

Я советую вам попытаться понять исключение, и если вы можете не отлаживайте свой код (пошагово проходите по одной строке за раз, и, если вы не знаете, как использовать отладчик, добавьте операторы println, проверяя, что код делает то, что, по вашему мнению, делает. Там, где ваш код действует не так, как вы ожидали? Вот в чем ошибка).

Этот план «о, он не работает, я просто выкину его целиком и найду другой способ сделать это», неоптимальный :) - go вернуться к первому фрагменту и просто исправить это.

1 голос
/ 26 января 2020

Если бы я искал повторяющиеся символы, я бы go использовал маршрут регулярного выражения. Например, чтобы искать повторяющиеся a символы (в этом примере повторяются дважды), вы могли бы иметь:

import java.util.regex.Pattern;

public class Temp {
  public static void main(final String[] args) {
    String array1 [] = {"abc","aabc","xyyyxy"};
    for (String item : array1){
      if (Pattern.compile("[a]{2}").matcher(item).find()) {
        System.out.println(item + " matches");
      }
    }
  }
}

В этом фрагменте reg exp равен "[a]{2}", который ищет любую последовательность символов повторяется дважды. Конечно, для более сложных соответствий требуются более сложные регулярные выражения, хорошие ресурсы для объяснения этого можно найти здесь: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html
Еще один момент заключается в том, что для повышения эффективности часто перемещают : Pattern.compile(*Pattern*) вне вызова метода, например, к final static field

Это переполнение стека:
RegEx Не более 2 одинаковых последовательных символов и aZ и 0-9
дает довольно подробное описание проблем регулярного выражения, связанных с этой проблемой.

1 голос
/ 26 января 2020

Вы получаете StringIndexOutOfBoundsException, потому что пытаетесь получить доступ к string.charAt(i + 1), где i поднимается до самого высокого индекса (то есть string.length() - 1) из string.

Вы можете сделать это следующим образом:

class Main {
    public static void main(String[] args) {
        int multiple_characters = 0;
        int i;
        String array1[] = { "abc", "aabc", "xyyyxy" };
        for (int index = 0; index < array1.length; index++) {
            System.out.println("String: " + array1[index]);
            for (i = 0; i < array1[index].length() - 1; i++) {
                multiple_characters = 1;
                while (array1[index].charAt(i) == array1[index].charAt(i + 1) && i < array1[index].length() - 1) {
                    multiple_characters++;
                    i++;
                }
                System.out.println(array1[index].charAt(i) + " has been repeated consecutively " + multiple_characters
                        + " time(s)");
            }
            if (multiple_characters == 1) {
                System.out.println(array1[index].charAt(i) + " has been repeated consecutively 1 time(s)");
            }
            System.out.println("------------");
        }
    }
}

Выход:

String: abc
a has been repeated consecutively 1 time(s)
b has been repeated consecutively 1 time(s)
c has been repeated consecutively 1 time(s)
------------
String: aabc
a has been repeated consecutively 2 time(s)
b has been repeated consecutively 1 time(s)
c has been repeated consecutively 1 time(s)
------------
String: xyyyxy
x has been repeated consecutively 1 time(s)
y has been repeated consecutively 3 time(s)
x has been repeated consecutively 1 time(s)
y has been repeated consecutively 1 time(s)
------------
...