字符串列表 - 奇怪的行为

List of Strings - Odd Behavior

我正在为随机词生成器开发一个淫秽过滤器,以便它避免某些词或短语。到目前为止代码相当简单,我正在使用一些测试词来尝试它,但是已经出现了一个对我来说完全没有意义的奇怪错误。

final List<String> obscene;

WordEngine(){
    obscene = new ArrayList<>();
    loadObscene();
    System.out.println(isObscene("otestingo"));
}

void loadObscene(){
    try {
        InputStream configStream = Interactions.class.getResourceAsStream("obscene.txt");
        Scanner fileScanner = new Scanner(configStream);
        fileScanner.useDelimiter("\n");
        String nextWord;
        while(fileScanner.hasNext()){
            nextWord = fileScanner.next();
            obscene.add(nextWord);
        }
    }catch(Exception e){
        System.out.println(e);
    }
    //for(String obsceneIterator : obscene){ System.out.println(obsceneIterator); }
}

boolean isObscene(String word){
    for (Iterator<String> it = obscene.iterator(); it.hasNext();) {
        String nextObscene = it.next();
        String test = nextObscene;
        System.out.println(test);
        System.out.println(test + " " + word);
        if(word.contains(nextObscene)){
            return true;
        }
    }
    return false;
}

文本文件包含:

words
for
testing

输出为:

words
otestingo
for
otestingo
testing
otestingo
false

预期输出为:

words
words otestingo
for
for otestingo
testing
testing otestingo
true

有关连接字符串或访问它的问题导致它被删除。我已经尝试了所有我能想到的探索,但没有找到任何方法来理解我期望的和我得到的之间的差异。

在您的文本文件中使用 UNIX 行结尾 (\n) 时,您的程序会产生您期望的输出。但是,如果您使用 dos 行结尾,您(几乎)会得到您描述的输出。我看到的真实输出是:

words
 otestingo
for
 otestingo
testing
 otestingo
false

您可能没有使用 UNIX 衍生版 OS - 我不知道转换行结尾的 Windows 工具是什么 - 但如果您有 Vim可以使用命令 ff=unix 并将文件写回以更改行结尾。

或者,您可以简单地删除这一行:

fileScanner.useDelimiter("\n");

...并且扫描器将正确处理您的 dos 行结尾。