2016-12-14 62 views
-2
package javaapplication15; 

import java.util.Scanner; 

public class JavaApplication15 { 

    public static void main(String[] args) { 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Enter your sentence: "); 
     String message = keyboard.nextLine(); 

     String[] words = {" gray "," better "," formed "," eggs "," made "," cost ", 
      " decide "," sequence "," crap "," have "," two "," six "}; 

     if(message.toLowerCase().contains(words)) 
      System.out.println("Sentence contains profanity"); 
     else 
      System.out.println("Sentence does not contain profanity"); 
    } 
} 

我需要代码来检查数组中的单词。如果句子有胡扯而不是废话,那么它就不应该显示任何亵渎。我的问题是if声明。我试图用含有数组名称的单词来说明一些关于charsequence的内容。需要检查用户输入的亵渎词的句子

+2

阅读此前实施:https://blog.codinghorror.com/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea/和https ://en.wikipedia.org/wiki/Scunthorpe_problem ...和* actual *错误信息,而不是“说些什么”,这很重要。 – ceejayoz

+1

这不适用于'egg.' –

+0

它说String []不能转换为charsequence –

回答

0

您需要遍历你的话在这个例子中,我使用一个布尔值来捕捉亵渎是否存在阵列

boolean isRude = false; 
    for (String oneword : words) { 
     if(message.toLowerCase().contains(oneword)) { 
      isRude = true; 
      break; 
     } 
    } 

    if (isRude) 
     System.out.println("Sentence contains profanity"); 
    else 
     System.out.println("Sentence does not contain profanity"); 

,然后在循环之后打印出来。

做到这一点的另一种方法是,也可以使用String.split将句子拆分为单词,然后比较单词对单词。这意味着你不需要在这些亵渎的词语上填空。

+0

只是好奇,为什么在煎蛋缘故这是downvoted?它是有效的代码,它修复了报告的错误。 –

+0

这是一个意外。 –

+0

很高兴知道。 *更好地形成鸡蛋* –

1

我猜(从包名称),这是一个学习练习。

所以,这里有一些提示,让你开始:

  1. 拆分输入行成文字。在javadocs中查看String.split方法...。

    如果您将文本拆分为单词,则匹配它们会更加容易。 (您不需要做复杂的事情来区分完整的单词和部分单词;例如“Scunthorpe”问题。)

  2. words数组中的单词之前/之后的空格没有帮助。即使你不把文本分成单词,也要考虑当你的文本的第一个单词是“灰色”时会发生什么......在它前面没有空格。

1

由于检查单词两边都有额外的空格,您的解决方案仅适用于可能输入的一小部分。你应该首先想出一个不需要的巧妙方法。

对于这样的问题,我会使用HashSet。首先,我们凑了亵渎的话,那么我们哈希解析输入句子和检查碰撞:

import java.util.HashSet; 
import java.util.Scanner; 

public class ProfanityChecker 
{ 
    public static void main(String[] args) 
    { 

     String[] profanityWords = {"gray","better","formed", "eggs","made", 
      "cost","decide","sequence","crap","have","two","six"}; 

     Scanner keyboard = new Scanner(System.in); 
     String inputSentence = keyboard.nextLine(); 

     if(checkForProfanity(profanityWords, inputSentence)) 
      System.out.println("Yes"); 
     else 
      System.out.println("No"); 
    } 

    private static boolean checkForProfanity(String[] profanityWords, String inputSentence) 
    { 
     HashSet<String> profanityHash = new HashSet<>(); 

     for(String word : profanityWords) 
      profanityHash.add(word); 

     String[] words = inputSentence.split("\\s+"); 

     for(String word : words) 
      if(!profanityHash.add(word)) 
       return true; 

     return false; 
    } 
} 

这样,它也将加快工作速度(M + N VS m * n个)。在现实生活场景中,你需要一本亵渎词典(size-m,200-300)和一篇好文章来扫描(size-n,比方说10000)。使用一个好的算法很重要。

你仍然可以做一些改进,例如预处理inputSentence来清理特殊字符(。,!?*),或者不使用分割来处理单词,这样它甚至可以应付更大范围的输入,更快。

我希望它有帮助。我相信这是很好的考虑细节..