Ищите количество подстрок в файле Java

Я ищу количество подстроки в файле Короче говоря, файл содержит определенное количество статей, и мне нужно знать, сколько. Каждая статья начинается с: @ARTICLE{ или с @ARTICLE{(ряд целых чисел)

Полезная информация: - У меня есть 10 файлов для просмотра - Нет пустых файлов - Этот код дает мне исключение StringIndexOutOfBounds

Вот код, который у меня есть до сих пор:

//To read through all files
    for(int i=1; i<=10; i++)
    {
    try
        {       
            //To look through all the bib files
            reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex"+i+".bib"));
            System.out.println("Reading Latex"+i+".bib->");

            //To read through the whole file
            while(reader.hasNextLine())
            {
                String line = reader.nextLine();
                String articles = line.substring(1, 7);

                if (line.equals("ARTICLE"))
                    count+=1;
            }
        }
    catch(FileNotFoundException e)
        {
            System.err.println("Error opening the file Latex"+i+".bib");
        }
    }
    System.out.print("\n"+count);
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
78
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Попробуйте просто использовать String#contains в каждой строке:

while(reader.hasNextLine()) {
    String line = reader.nextLine();
    if (line.contains("ARTICLE")) {
        count += 1;
    }
}

Это, по крайней мере, обойдет проблему необходимости брать подстроку в первую очередь. Проблема заключается в том, что в то время как совпадающие строки не должны иметь исключение за пределами границ, а строки длиннее 7 символов, которые не совпадают, строки, содержащие менее 7 символов, могут вызвать проблему.

Вы также можете использовать шаблон регулярного выражения, чтобы убедиться, что вы соответствуете ARTICLE как отдельному слову:

while(reader.hasNextLine()) {
    String line = reader.nextLine();
    if (line.matches("\\bARTICLE\\b")) {
        count += 1;
    }
}

Это гарантирует, что вы не засчитаете строку, содержащую что-то вроде articles, что не является вашей точной целью.

Вы можете проверить, начинается ли строка с нужной последовательности:

if (line.startsWith("ARTICLE")) {
    count += 1;
}

Вы получаете StringIndexOutOfBounds из этой строки кода:

String articles = line.substring(1, 7);

Считываемая строка может быть пустой или содержать менее 7 символов. Чтобы избежать получения StringIndexOutOfBounds, у вас должна быть условная проверка, чтобы увидеть,

длина строки > 7

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

Поскольку вы читаете строку за строкой, string.contains является хорошим выбором вместо подстроки, с другой стороны, все статьи начинаются с "@СТАТЬЯ", поэтому используйте "@СТАТЬЯ" в условии. Для проверки кода попробуйте это -

public class test {

    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <= 10; i++) {

            try {
                //To look through all the bib files
                Scanner reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex" + i + ".bib"));
                System.out.println("Reading Latex" + i + ".bib->");

                //To read through the whole file
                while (reader.hasNextLine()) {
                    String line = reader.nextLine();
                    if (line.contains("@ARTICLE")) {
                        count += 1;
                    }
                }
            } catch (FileNotFoundException e) {
                System.err.println("Error opening the file Latex" + i + ".bib");
            }
        }
        System.out.print("\n" + count);
    } }

Другие вопросы по теме