字符串列表 - 奇怪的行为

时间:2015-03-10 01:00:10

标签: java java.util.scanner contains string-concatenation

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

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

关于连接字符串或访问它的一些事情导致它被删除。我已经尝试过各种我能想到的探索,并且没有找到任何方法来理解我期望和我得到的之间的差异。

1 个答案:

答案 0 :(得分:2)

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

words
 otestingo
for
 otestingo
testing
 otestingo
false

您可能不在UNIX衍生操作系统上 - 而且我不知道转换行结尾的Windows工具是什么 - 但如果您有Vim,则可以使用命令ff=unix和写回文件以更改行结尾。

或者,您只需删除此行:

fileScanner.useDelimiter("\\n");

...扫描仪将正确处理您的dos行结束。