2016-12-14 31 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來清理特殊字符(。,!?*),或者不使用分割來處理單詞,這樣它甚至可以應付更大範圍的輸入,更快。

我希望它有幫助。我相信這是很好的考慮細節..