我正在为随机单词生成器制作一个淫秽过滤器,以避免某些单词或短语。到目前为止,代码非常简单,我使用了一些测试词来试用它,但是已经发生了一个奇怪的错误,这对我来说完全没有意义。
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
关于连接字符串或访问它的一些事情导致它被删除。我已经尝试过各种我能想到的探索,并且没有找到任何方法来理解我期望和我得到的之间的差异。
答案 0 :(得分:2)
在文本文件中使用UNIX行结尾(\n
)时,程序会生成您期望的输出。但是,如果您使用dos行结尾,则(几乎)获得您描述的输出。我看到的真实输出是:
words
otestingo
for
otestingo
testing
otestingo
false
您可能不在UNIX衍生操作系统上 - 而且我不知道转换行结尾的Windows工具是什么 - 但如果您有Vim,则可以使用命令ff=unix
和写回文件以更改行结尾。
或者,您只需删除此行:
fileScanner.useDelimiter("\\n");
...扫描仪将正确处理您的dos行结束。