ดังนั้นฉันจึงทำงานกับโค้ดที่ฉันติดอยู่

ฉันติดอยู่กับภารกิจ! กรุณาช่วย! การมอบหมายงานถาม

เราต้องการให้ทางเลือกแก่ผู้ใช้ของเราในการกรองคำหยาบคายออกไป สมมติว่าเราถือว่าคำว่า แมว สุนัข และลามะ เป็นคำหยาบคาย เขียนโปรแกรมที่อ่านสตริงจากแป้นพิมพ์และทดสอบว่าสตริงนั้นมีคำหยาบคายคำใดคำหนึ่งของเราหรือไม่ ให้โปรแกรมของคุณปฏิเสธเฉพาะบรรทัดที่มีคำหยาบคายเท่านั้น ตัวอย่างเช่น การต่อข้อมูลแบบ Dogmatic เป็นหมวดหมู่ขนาดเล็ก ประโยคนี้ไม่ควรถือเป็นคำหยาบคาย ฉันรู้ว่า ==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