需要检查用户输入的亵渎词语的句子

时间:2016-12-14 01:11:59

标签: java

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声明。我试图将数组名称单词与contains一起使用,但是说了一些关于charsequence的内容。

3 个答案:

答案 0 :(得分:2)

由于选中单词两侧的额外空格,您的解决方案仅适用于可能输入的一小部分。你应该首先想出一个不需要它的聪明方法。

对于这样的问题,我会使用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来清理特殊字符(。,!?*),或者处理单词而不使用split,这样它甚至可以应付更大的输入频谱,更快。

我希望它有所帮助。我相信考虑细节是好事。

答案 1 :(得分:1)

我猜测(从包名中)这是一个学习练习。

所以,这里有一些提示可以帮助你入门:

  1. 将输入行拆分为单词。查看javadoc中的String.split方法....

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

  2. words数组中单词之前/之后的空格没有帮助。即使你没有将文本分成单词,也要考虑当你的文本的第一个单词是&#34; Gray&#34; ......前面没有空格。

答案 2 :(得分: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将句子拆分成单词,然后比较单词到单词。这意味着你不需要填空亵渎的单词。