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

#java #string #file #fileinputstream

#java #строка #файл #fileinputstream

Вопрос:

Я ищу количество подстрок в файле Короче говоря, файл содержит определенное количество статей, и мне нужно знать, сколько. Каждая статья начинается с: @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);
  

Ответ №1:

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

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

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

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

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

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

Ответ №2:

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

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

Ответ №3:

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

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

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

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

Помимо этого, тогда лучше использовать ответы, рекомендованные выше (т.Е. .contains или .StartsWith)

Ответ №4:

Поскольку вы читаете построчно, string.contains является хорошим выбором вместо substring , с другой стороны, все статьи начинаются с «@ARTICLE», поэтому используйте «@ARTICLE» в условии. Для тестирования кода, пожалуйста, попробуйте это —

 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);
    } }