Итак, я работаю над кодом, с которым я застрял

Я застрял на задании! Пожалуйста помоги! задания спрашивает

Мы хотели бы дать нашим пользователям возможность фильтровать ненормативную лексику. Предположим, что мы считаем слова кошка, собака и лама нечестивыми. Напишите программу, которая считывает строку с клавиатуры и проверяет, содержит ли строка одно из наших ненормативных слов. Пусть ваша программа отклоняет только те строки, которые точно содержат ненормативное слово. Например, догматическая конкатенация — это небольшая категория. Это предложение не следует считать оскорбительным. Я знаю, что ==0 неправильно, но я хочу, чтобы в нем не было слова катаклизм, чтобы он не был нецензурным, и распечатывал предложение типа «буря была катаклизмом», а не был богохульным.

import java.util.*;

public class Profanity {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

String words;

System.out.println("Enter a sentence");
words = in.nextLine();
words = words.toLowerCase();

if (words.indexOf("cat") !=-1)
{
    if(words.length()==3)
        System.out.println("cats by itself censored!");

else if(words.indexOf("cat ")==0)
    System.out.println("cat is in the beginning censored!");
else if(words.indexOf(" cat ")!=-1)
    System.out.println("cat is in the string censored!");
else if(words.indexOf(" cat")==0); //<-- ==0 is def wrong, please help
    System.out.println("cat is at the end censored!"); }
else
    System.out.println(words);
}}

person user2821574    schedule 27.09.2013    source источник
comment
Возможный дубликат ошибки фильтра ненормативной лексики   -  person Yilmaz    schedule 30.06.2019


Ответы (2)


Ваше решение ошибочно. Он не обрабатывает пунктуацию, и " cat" не обязательно соответствует концу предложения. например please catch the cat -- catch будет сопоставлено и проигнорировано, а cat будет пропущено.

Вам нужен цикл для поиска всех вхождений "cat". Используйте версию indexOf, которая выполняет поиск по заданному индексу:

public int indexOf(String str, int fromIndex)

Идея здесь в том, что всякий раз, когда вы находите совпадение, вы проверяете символ перед ним и символ после него, чтобы увидеть, являются ли они буквой (используйте Character.isLetter). Вот когда вы выполняете проверку границ. Затем вы начинаете искать word по индексу lastIndex + word.length() и продолжаете цикл, пока не просмотрите всю строку.

Вы можете обернуть это внутри другого цикла, чтобы вам не приходилось жестко кодировать все ваши ненормативные слова. Просто поместите их все в массив и выполните цикл по массиву.

person paddy    schedule 27.09.2013

else if(word.indexOf(" cat")==(word.length()-5);

Должно сработать.

person nhgrif    schedule 27.09.2013
comment
Вы попробовали именно то, что я набрал, и это срабатывает при катаклизме? Если " cat" является подстрокой word и составляет последние 4 символа string word, то индекс должен возвращать на 4 меньше, чем последний индекс, а последний индекс на единицу меньше целочисленного значения, возвращаемого вызовом метода .length(). . - person nhgrif; 27.09.2013
comment
В конкретном случае "the storm was a cataclysm" вызов метода word.indexOf(" cat") должен возвращать 15, поскольку " cat" появляется, начиная с индекса 15. Между тем, word.length() должен возвращать 26, так как это длина всей строки. (И word.length()-5 даст вам 20, что != word.indexOf(" cat") - person nhgrif; 27.09.2013
comment
Измените свою программу и заставьте ее печатать значения, возвращаемые всеми вашими word.indexOf вызовами. - person nhgrif; 27.09.2013