Если заявление, чтобы обнаружить определенные слова в строке - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь написать Java-программу, которая обнаруживает определенные слова в строке, которые считаются «ненормативными словами». Пользователь вводит строку, и программа должна вывести на экран, что профанные слова были обнаружены, поскольку она должна напечатать, что профанные слова не обнаружены. Для этой программы профанными словами являются «кошка», «собака» и «лама». Программа должна обнаружить эти слова, если они написаны с большой буквы. Он не должен идентифицировать слова как профанные, которые включают в себя профанные слова. Пример: кошки или кататоники не профаны.

Я написал программу, которая запускает и обнаруживает ненормативную лексику соответственно. Тем не менее, он выводит на экран оба сообщения «Обнаружено ненормативную лексику» и «Обнаружено ненормативное слово» Я изо всех сил пытаюсь выяснить, как заставить его печатать светские слова, обнаруженные, когда они на самом деле являются светскими словами.

import java.util.Scanner;

public class Ch3_Programming_Project3 {

    public static void main(String[] args) {

        Scanner keyboard=new Scanner(System.in);

        boolean startProgram=true; 

        System.out.println("The words cat, dog, and llama are considered"
                  +" profane and will not be allowed.");

        if (startProgram== true) {

            System.out.println("Please enter a sentence:");
            String sentence=keyboard.next();
            sentence=sentence.toLowerCase();

            boolean cat=true, dog=true, llama=true;

            if (sentence.contains("cat")) {
                cat=true;
            }

            if (sentence.contains("dog")) {
                dog=true;
            }

            if (sentence.contains("llama")) {
                llama=true;
            } else {
                System.out.println("No profanity detected." + " Sentence approved.");
            }

            if (cat==true || dog==true || llama==true) {

                if (cat == true) {
                    if (cat==true&&dog==true&&llama==true) {
                        System.out.println("Profanity detected");
                        System.exit(0);
                    } else if (cat==true && dog==true) {
                        System.out.println("Profanity detected");
                        System.exit(0);
                    } else if (cat==true && llama==true) {
                        System.out.println("Profanity detected");
                        System.exit(0);
                    } else {
                        System.out.println("Profanity detected");
                        System.exit(0);
                    }    
                }

                if (dog == true) {
                    if (dog==true && llama==true) {
                        System.out.println("Profanity detected");
                        System.exit(0);
                    } else {
                        System.out.println("Profanity detected");
                        System.exit(0);
                    }                     
                }

                if (llama == true) {
                    System.out.println("Profanity detected");
                    System.exit(0);
                }
            }
        } else if (startProgram == false) {
            System.exit(0);
        } else {
            System.out.println("Program was force closed.");
            System.exit(0);
        }
        System.exit(0);
    }//end main
}//end class

Я очень новичок в Java и искренне хочу учиться. Да, это домашнее задание. Но я уже представил это и пытаюсь понять, где моя ошибка, и учиться. Я пытался поискать и искать другие сообщения, чтобы определить мою проблему, но безуспешно.

Заранее благодарю всех, кто может мне помочь.

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Ваш код можно значительно упростить, разбив предложение и сохранив плохие слова в List

    List<String> pwords = Arrays.asList(new String []{"dog", "cat", "llama"});

    String str = "it is raining a cat and a dog";
    // or accept from keyBoard
    //System.out.println("Please enter a sentence:");
    // String str = keyboard.nextLine();
    // str = str.toLowerCase();

    System.out.println(str);
    String [] arr = str.split("\\s+");
    for (String w : arr) {

        if (pwords.contains(w)) {
            System.out.println("contains profanity");
            return;
        }
    }
    System.out.println("a clean sentence");

редактировать

выход

it is raining a cat and a dog
contains profanity

it is raining a cats and a dogs
a clean sentence
0 голосов
/ 28 июня 2018

Итак, вы запускаете программу, проверяя, содержит ли String профанные слова, а затем имеют флажки, чтобы указать, содержит ли она какие-либо профанные слова. Хороший подход.

Однако после этого ..

Если один из трех флагов верен: System.out.println("Profanity detected"); System.exit(0);

Если dog истинно: System.out.println("Profanity detected"); System.exit(0);

Если один из двух флагов верен: System.out.println("Profanity detected"); System.exit(0);

Остальное: System.out.println("Profanity detected"); System.exit(0);

, если cat истинно: System.out.println("Profanity detected"); System.exit(0);

Если один из двух других флагов имеет значение true: System.out.println("Profanity detected"); System.exit(0);

Я собираюсь на этом остановиться, но думаю, вы понимаете мою точку зрения. По сути, каждая ветка в вашей сети if-else ведет к одному и тому же. Вы должны закрепить это. Вы можете просто сделать в своей первой ветке if-else что-то вроде:

if(sentence.contains("llama") {
   System.out.println("Contains profane word: llama");
}
//And so on

Таким образом, вам даже не понадобятся флаги или любые другие if-else (также, как указано в других ответах, вам нужно изменить keyboard.next() на keyboard.nextLine()

0 голосов
/ 28 июня 2018

Ваша программа слишком сложна и может быть немного упрощена.

Прежде всего, все ваши if/else утверждения могут быть сведены к одному. Кроме того, как указал Страшный Вомбат в комментариях, вы должны были использовать keyboard.nextLine() для получения ввода от пользователя.

Вот новый код для вас Main метод:

public static void main(String[] args) {

    Scanner keyboard = new Scanner(System.in);

    System.out.println("The words cat, dog, and llama are considered"
            + " profane and will not be allowed.");

    System.out.println("Please enter a sentence:");
    String sentence = keyboard.nextLine();
    sentence = sentence.toLowerCase();

    boolean foundProfane = false;
    if (sentence.matches(".*\\bcat\\b.*")
            || sentence.matches(".*\\bdog\\b.*")
            || sentence.matches(".*\\bllama\\b.*")) {
        foundProfane = true;
    }

    if (foundProfane) {
        System.out.println("Profanity Detected!");
    } else {
        System.out.println("No profanity detected!");
    }

}

.*\\b и \\b.* в строках позволяют вам захватывать только полное слово, поэтому оно не будет помечено, например, при вводе "catalog".

Используя только один boolean для отслеживания того, было ли добавлено профанное слово, вы можете хранить все свои чеки в одном месте и просто перевернуть boolean, если найдено непослушное слово.

Также я удалил всю структуру startProgram, так как она никак не повлияла на программу.

Примечание: Есть несколько других улучшений, которые могут быть сделаны, но, поскольку вы только начинаете работать с Java, это все равно должно соответствовать вашему текущему уровню навыков. Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...