Как правильно вытащить слова апострофами?Такие слова, как «не будет» и «не удалось», помещаются в ArrayList как «не сработает» и «не может» - PullRequest
0 голосов
/ 31 марта 2019

Студент по сетевым технологиям / программированию здесь пытается выполнить задание, и я наткнулся на загадку. Перед нами стоит чтение в текстовом файле, размещение слов в ArrayList и выполнение строковых операций с содержимым. Я могу вытащить слова в ArrayList, отсортировать содержимое в порядке возрастания, удалить любые слова длиной менее четырех символов, удалить повторяющиеся записи и удалить цифры. Однако я обнаружил, что слова с апострофами «обрезаются». Такие слова, как «не будет» и «не может», помещаются в мой ArrayList как «быт» и «не может».

Я пробовал разные разделители для моего объекта сканера, но я не могу найти тот, который будет хранить апострофы в словах и не будет обрезать слово после апострофа.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Scanner;

public class textFile {

    public static void main(String[] args) throws FileNotFoundException {

        // Scanner object reads in the required text file to the "words" ArrayList.
        Scanner sc = new Scanner(new File("textfile.txt"), "UTF-8");
        ArrayList<String> words = new ArrayList<String>();
        while (sc.hasNext()) {
            sc.useDelimiter("[^A-Za-z]");
            words.add(sc.next().toLowerCase());

        }
        // Closes the Scanner object used just above.
        sc.close();

        // Sorts the "words" ArrayList in ascending order.
        Collections.sort(words);

        // Creates the "wordsNoDuplicates" ArrayList. Removes duplicate strings.
        LinkedHashSet<String> wordsNoDup = new LinkedHashSet<String>(words);

        // Removes all words containing less than four characters.
        wordsNoDup.removeIf(u -> u.length() < 4);

        // Prints the total number of words in the "wordsNoDup" ArrayList
        System.out.println("Total Number of Words: " + wordsNoDup.size() + "\n");

        // Calculate and print the average word length.
        // double avgWordLength = 21186 / wordsNoDup.size();

        System.out.println("Average Word Length: " + 7.0 + "\n");

        // Print out the "words" ArrayList. Intended for debugging.
        System.out.print(wordsNoDup);

        System.out.println();

    }
}

Опять же, такие слова, как «не может», «не должен» и «не будет», вводятся как «cann», «mustn» и «willn». Похоже на апостроф и все, что после него отбрасывается. Я открыто признаю, что я не обладаю глубокими знаниями Java или программирования, но любая помощь будет принята с благодарностью!

1 Ответ

2 голосов
/ 31 марта 2019

С использованием этого в вашем коде,

sc.useDelimiter("[^A-Za-z]");

Любой символ, отличный от алфавита, будет действовать как разделитель, и, следовательно, ' также будет действовать как разделитель, поэтому я предлагаю изменить приведенную выше строку кода на эту,

sc.useDelimiter("[^A-Za-z']");

Таким образом, ' больше не будет рассматриваться как разделитель и должен сохранять ' в словах.

Но я думаю, что было бы лучше прочитать ваш текст и использовать правильное регулярное выражение, чтобы просто сопоставить и отфильтровать ваши слова, поэтому вы допускаете ' только в исключительных случаях, когда он присутствует в слове и не может быть вне слова .

...