Как сделать чтобы функция работала без учета регистра

Рейтинг: 0Ответов: 1Опубликовано: 18.06.2023

Задача:

Прочитать текст из файла и написать функцию, которая считает количество вхождений некоторой строки в этот текст без учета регистра символов. Сама функция должна работать без учета регистра.
Использовать цикл и indexOf, который принимает начальный индекс, с которого искать.

Просьба подсказать, как сделать функцию без учета регистра? Возможно, через регулярные выражения.

Код.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class OccurrencesCount {
    public static void main(String[] args) throws FileNotFoundException {
        String searchString = "word";

        File file = new File("out.txt");
        System.out.println("Количество вхождений подстроки " + searchString + " = " + getOccurrencesCount(searchString, file));
    }

    public static int getOccurrencesCount(String searchString, File file) throws FileNotFoundException {
        try (Scanner scanner = new Scanner(file)) {
            int occurrencesCount = 0;

            while (scanner.hasNextLine()) {
                String inputString = scanner.nextLine().toLowerCase();
                int searchStringStartIndex = 0;

                while (true) {
                    searchStringStartIndex = searchString.indexOf(inputString,searchStringStartIndex);

                    if (searchStringStartIndex < 0) {
                        break;
                    }

                    occurrencesCount++;

                    searchStringStartIndex += searchString.length();
                }
            }

            return occurrencesCount;
        }
    }
}

Ответы

▲ 1Принят

Вы и так практически написали функцию, которая работает без учёта регистра. Остаётся только, помимо регистра каждой строки файла, понижать и регистр искомой подстроки searchString, и тогда функция действительно будет регистронезависимой.

К примеру, чтобы не понижать регистр искомой подстроки каждый раз, это можно сделать вот так в самом начале работы функции:

searchString = searchString.toLowerCase();

С другой стороны, в коде есть другая проблема. Строка

searchStringStartIndex = searchString.indexOf(inputString,searchStringStartIndex);

некорректна. Она у вас ищет вхождение строки в подстроку, а не наоборот. Её надо применять к исходной строке, а в качестве параметра передавать подстроку, то есть:

searchStringStartIndex = inputString.indexOf(searchString, searchStringStartIndex);