为什么我的亵渎过滤器不起作用?

时间:2010-11-08 16:01:03

标签: java list string

List<String> cursewords = new ArrayList<String>();
cursewords.add("darn it");
cursewords.add("gosh");
cursewords.add("gee whiz");
cursewords.add("golly");

String text = " Golly ";

if (cursewords.contains(text.trim().toLowerCase())  {
    System.out.println("found curse:" + text);
}

有更好的方法吗?

我的过滤器没有抓住它需要的东西。

6 个答案:

答案 0 :(得分:4)

如果textcursewords中的某个条目相同(根本没有其他字符),则您的过滤器目前才有效。要解决此问题,您需要反复遍历cursewords中的项目并检查text是否包含该项目。

这是一个简单的例子(使用enhanced for loop):

// Convert the string to lowercase here, instead of within the loop
string lowerCaseText = text.toLowerCase();

for (String curse : cursewords) {
    if (lowerCaseText.contains(curse)) {
       System.out.println("found curse:" + curse);
    }
}

虽然正如其他人所提到的那样,使用正则表达式来解释诅咒的变化并避免使用clbuttic mistakes可能会更好。

答案 1 :(得分:1)

List.contains()将查找完全匹配。

也许你需要这样做:

for(String curseword:cursewords) {
    //wrong
    //if(curseword.contains(text.trim().toLowerCase())) {
    if(text.trim().toLowerCase().contains(curseword)) {
        ...
    }
}

答案 2 :(得分:1)

您的代码在此行中出错:

if (cursewords.contains(text.trim().toLowerCase())  {

将您的if声明附加),如下所示:

if (cursewords.contains(text.trim().toLowerCase()))  {

结果,现在提供的代码有效:

  

发现诅咒:Golly

答案 3 :(得分:0)

RegEx过滤器是查找诅咒效果的更好方法,因为f * k或 * muncher可能有多个不同的中间部分。请查看Pattern类和Mattcher类,了解有关如何编写诅咒文字过滤器的提示。

答案 4 :(得分:0)

这种方法与正则表达式不同。它假定您已将您的短语解析为单个单词。

答案 5 :(得分:0)

其他人已经在你的代码中指出了这个错误。但是,一个普遍的改进是使用词干分析器预处理文本,然后将输出与更易管理的“根”诅咒词组进行比较。例如,“翻转”的词干将是“翻转”。然后,不是每次都针对每个诅咒词检查整个文本,而是迭代文本中每个预处理的单词,并检查它是否等于你的任何一个诅咒词。

其他更明显的预处理措施是删除所有标点符号并将所有文本设为小写。

Set<String> stemmedCurseWords = new HashSet<String>();
stemmedCurseWords.add("flip");
stemmedCurseWords.add("gosh");

String text = "I was flipping late for work again."
boolean foundCurseWord = false;

String[] stemmedText = preprocess(text);
for (String word : stemmedText) {
  if (stemmedCurseWords.contains(word)) {
    foundCurseWord = true;
    break;
  }
}

if (foundCurseWord) {
  System.err.println("Bad manners");
}