Словарь входного файла и манипуляции со строками - PullRequest
0 голосов
/ 25 октября 2018

Я пишу программу, которая ищет в импортированном файле строку символов и длины, которую вводит пользователь.Например, "Введите возможные буквы в вашем слове:" Сканирование клавиатуры "aeppr" "Введите количество букв в ваших целевых словах:" "5"

, а затем приступает к поиску в моем файле словаря и в конечном итоге печатает: 1 paper

Мне было интересно, можете ли вы использовать indexOf или любые другие методы или классы для отображения этого результата.На данный момент мой код отображает только слова, которые точно соответствуют искомым буквам и длине.Любая помощь или совет будет принята с благодарностью.

    String input;
    String altInput;

    Scanner inFile = new Scanner(new File("words.txt"));
    Scanner scanner = new Scanner(System.in);

    String lettersBeingTested;
    int numberOfLetters;

    System.out.println("Enter the possible letters in your word: ");
    lettersBeingTested = scanner.next();
    System.out.println("Enter the number of letters in your target words: ");
    numberOfLetters = scanner.nextInt();
    int count = 0;
    while (inFile.hasNext()) {

        input = inFile.next();
        altInput = "";

        for (int i = 0; i < input.length(); i++) {

            altInput = altInput + input.charAt(i);

            if (input.contains(lettersBeingTested) && altInput.length() == numberOfLetters) {

                count++;
                System.out.println(count + " " + altInput);

            }
        }
    }
    System.out.println("End of list: " + count + " words found");

    inFile.close();
}

1 Ответ

0 голосов
/ 25 октября 2018
public static void main(String[] args) throws FileNotFoundException {
    findWords(new File("words.txt"));
}

public static void findWords(File file) throws FileNotFoundException {
    try (Scanner scan = new Scanner(System.in)) {
        System.out.println("Enter the possible letters in your word: ");
        String lettersBeingTested = scan.next();
        System.out.println("Enter the number of letters in your target words: ");
        int numberOfLetters = scan.nextInt();
        int[] requiredHistogram = histogram(lettersBeingTested, new int[26]);

        Predicate<int[]> predicate = wordHistogram -> {
            for (int i = 0; i < requiredHistogram.length; i++)
                if (requiredHistogram[i] > 0 && wordHistogram[i] < requiredHistogram[i])
                    return false;
            return true;
        };

        Set<String> words = findWords(file, predicate, numberOfLetters);
        int i = 1;

        for (String word : words)
            System.out.println(i + " " + word);

        System.out.println("End of list: " + words.size() + " words found");
    }
}

private static int[] histogram(String str, int[] histogram) {
    Arrays.fill(histogram, 0);
    str = str.toLowerCase();

    for (int i = 0; i < str.length(); i++)
        histogram[str.charAt(i) - 'a']++;

    return histogram;
}

private static Set<String> findWords(File file, Predicate<int[]> predicate, int numberOfLetters) throws FileNotFoundException {
    try (Scanner scan = new Scanner(file)) {
        Set<String> words = new LinkedHashSet<>();
        int[] histogram = new int[26];

        while (scan.hasNext()) {
            String word = scan.next().toLowerCase();

            if (word.length() == numberOfLetters && predicate.test(histogram(word, histogram)))
                words.add(word);
        }

        return words;
    }
}

Это выглядит немного сложнее с использованием гистограммы.Я думаю, что если lettersBeingTested = "aa", то вы ищете слова с по крайней мере 2 'a' в нем.Поэтому вам нужно построить гистограмму и сравнить номер появления символа в текущих словах и в примере 1.

PS

altInput = altInput + input.charAt(i);

Конкатенация строк в цикле плохо работаетспектакль.Посмотрите на StringBuilder isntead.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...