如何正确地用撇号输入单词?像“不会”和“不能”这样的词被放入ArrayList中作为“wouldn”和“couldn”

问题描述 投票:0回答:1

IT网络/编程学生在这里试图完成一项任务,我遇到了麻烦。我们的任务是读取文本文件,将单词放入ArrayList,然后对内容执行字符串操作。我能够将单词拉入ArrayList,按升序对内容进行排序,删除少于四个字符的单词,删除重复的条目,并删除数字。我发现的是,带有撇号的词语正在被“切断”。像“不会”和“不能”这样的词被放入我的ArrayList中作为“wouldn”和“couldn”。

我已经为我的扫描仪对象尝试了不同的分隔符,但是我似乎无法找到一个会用撇号保留撇号并且不会在撇号之后删掉它的那个。

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

    }
}

同样,像“不能”,“不应该”和“不会”这样的词语被称为“不能”,“不应该”和“不会”。看起来像撇号和它后面的任何东西。我将公开承认我不是一个对Java或编程有广泛了解的人,但我们将非常感谢您的帮助!

java regex text-files java.util.scanner delimiter
1个回答
2
投票

在代码中使用它,

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

除字母之外的任何字符都将充当分隔符,因此'也将作为分隔符,因此我建议将上面的代码行更改为此,

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

所以'将不再被视为分隔符,并应保留'的话。

但我认为阅读你的文本并使用正确的正则表达式来匹配和过滤你的单词应该更好,所以,只有在一个单词中出现'而不是单词之外时,你才会特别允许它。

© www.soinside.com 2019 - 2024. All rights reserved.