Ищите количество подстроки в файле Java - PullRequest
0 голосов
/ 16 марта 2019

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

Ответы [ 4 ]

1 голос
/ 16 марта 2019

Попробуйте просто использовать 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, которая не является вашей точной целью.

0 голосов
/ 16 марта 2019

Поскольку вы читаете построчно, поэтому string.contains - хороший выбор вместо подстроки, с другой стороны, все статьи начинаются с "@ 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);
    } }
0 голосов
/ 16 марта 2019

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

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

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

line.length> 7

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

0 голосов
/ 16 марта 2019

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

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