2016-12-14 3 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 ...そして、実際のエラーメッセージは、「何かについて」は重要ではないでしょう。 – ceejayoz

+1

これは 'eggs.'のためにはうまくいかないでしょう –

+0

String []は文字列に変換できません –

答えて

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"); 

をループにする必要があります。

これを行うもう1つの方法は、文章をString.splitを使用して単語に分割し、単語と単語を比較することです。これは、あなたが不敬な言葉をスペースパッドする必要がないことを意味します。

+0

ちょうど好奇心、なぜ揚げた卵の酒はこれがdownvotedですか?これは有効なコードであり、報告されたエラーを修正します。 –

+0

それは事故だった。 –

+0

知っておきたい。 *より良い形の卵* –

1

私はこれが学習の練習であると(パッケージ名から)推測しています。

  1. 分割入力行の単語へ:

    ので、ここであなたが始めるためのヒントのカップルです。 javadocsのString.splitメソッドを見てください。

    テキストが単語に分割されている場合は、それを照合する方が簡単です。

  2. words配列内の単語の前後の空白は役立ちません。(例: "Scunthorpe"などの完全な単語と部分的な単語を区別するために複雑な作業は必要ありません。テキストを単語に分割しなくても、テキストの最初の単語が「グレー」のときにはどうなるか考えてください。

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は、m個の* nの対)より高速に動作します。現実のシナリオでは、profanityWords(size-m、200-300)の辞書と、スキャンする長さの良い記事(size-n、10000としましょう)があります。良いアルゴリズムを使用することが重要です。

特殊文字(。、!?*)をクリーンアップするためのinputSentenceの前処理や、splitを使用しないで単語を処理するなど、改善がまだあります。入力のスペクトルが大きくなると、より高速になります。

私はそれが役に立ちそうです。詳細について考えてみるといいと思います。

関連する問題