2016-09-03 3 views
0

У меня есть следующий код для работы бот-чата. Однако он не работает должным образом. Когда я запускаю отладчик, он показывает, что «bye», по какой-то причудливой причине, продолжает присваиваться «ключевому слову». По логике все выглядит так, как будто оно должно работать по назначению. Но, видимо, нет. Любая помощь приветствуется. Я довольно новичок в программировании на Java.Java chatbot - код не работает по умолчанию

public class Chatbot { 


    public Chatbot() 
    { 
    } 

    /* 
    * Generates a variety of responses, based on what the user has stated 
    */ 
    public static void respond(String statement) 
    {   
     // use the findKeyword method to check for various cases of user statements 
     if(statement.length() == 0) 
     { 
      System.out.println("Please say something :)"); 
     } 

     else if(findKeyword(statement, "hi") > 0 || 
      findKeyword(statement, "hello") > 0 || 
      findKeyword(statement, "hey") > 0 || 
      findKeyword(statement, "hiya") > 0 || 
      findKeyword(statement, "heya") > 0) 
      { 
       System.out.println("Hello to you too!"); 
      } 

     else if(findKeyword(statement, "how are you") > 0 || 
       findKeyword(statement, "hows it going") > 0 || 
       findKeyword(statement, "howre you") > 0 || 
       findKeyword(statement, "how ya doing") > 0 || 
       findKeyword(statement, "yo wassup") > 0 || 
       findKeyword(statement, "hey whats up") > 0 || 
       findKeyword(statement, "whats up") > 0) 
      { 
       System.out.println("I'm good, how are you?"); 
      } 
    } 



    /* 
    * findKeyword method, returns either a 0 or a 1 
    * @ 0 -- keyword not found 
    * @ 1 -- keyword found 
    */ 
    public static int findKeyword(String statement, String keyword) 
    { 

       // This is in case the keyword is not in the statement at all 
     if(!statement.contains(keyword)) 
     { 
      return 0; 
     } 


     int position = statement.toLowerCase().indexOf(keyword.toLowerCase());  // position of the keyword in the statement 
     statement = " " + statement.toLowerCase().replaceAll("\'\",.?", "") + " ";     // the purpose of this statement is to allow for us to search for specific phrases w/ spaces before and after the keyword 

     String sub = statement.substring(position, position + keyword.length() + 1); // isolates the keyword with 1 character before and after 

     String charBeforeKeyword = sub.substring(0, 1);        // the character before the keyword 
     String charAfterKeyword = sub.substring(sub.length() - 1, sub.length());  // the character after the keyword 



     /* 
     * Now, we check to see if the characters we isolated before are letters; if they are  * 
     * @ If they are letters...then our keyword is part of a bigger word (e.g. if we searched for "success" and it brought us "successful" 
     * @ If they are not letters, then we have found our keyword with punctuation and/or spaces before/after it 
     */ 
     if((charBeforeKeyword.compareTo("a") < 0 || charBeforeKeyword.compareTo("z") > 0) 
       && (charAfterKeyword.compareTo("a") < 0 || charAfterKeyword.compareTo("z") > 0)) 
     { 
      return 1; 
     } 

     return 0; 

    } 


} 



import java.util.Scanner; 

public class Execute 
{ 
    public static void main(String [] args) 
    { 
     // Variables and Objects 
     Chatbot bot = new Chatbot(); 
     Scanner input = new Scanner(System.in); 
     String statement = ""; 

     // Prompt and get the user's first input 
     System.out.println("Type text to start chatting!"); 
     statement = input.nextLine(); 

     // While the user doesn't say goodbye or some other form of it, respond to user and then get their next response 
     while(bot.findKeyword(statement, "bye") != 1 && 
       bot.findKeyword(statement, "cya") != 1 && 
       bot.findKeyword(statement, "goodbye") != 1 && 
       bot.findKeyword(statement, "gtg") != 1) 
     { 
      bot.respond(statement); 
      statement = input.nextLine(); 
     } 
     System.out.println("Goodbye!"); 




    } 

} 
+1

Читайте, как опубликовать [mcve] а затем отредактируйте свой вопрос. – reformed

+0

Вы не можете сказать, что «это не работает должным образом», но не сообщите нам, как оно должно работать. Расскажите нам, что произойдет и чего вы ожидаете, или мы ничего не сможем сделать. Приведите пример ввода вывода, который вы ожидаете. – nhouser9

ответ

1

1, Пожалуйста, прочитайте Javadoc из substring.

Возвращает новую строку, которая является подстрокой этой строки. Подстрока начинается с указанного beginIndex и продолжается до символа в индекса ENDINDEX - 1

Основываясь на вашей логике, вы должны изменить

String sub = statement.substring(position, position + keyword.length() + 1); 

в

String sub = statement.substring(position, position + keyword.length() + 2); 

2 , Нет необходимости использовать статический метод в Chatbot, так как вы создали экземпляр Chatbot.

3, не забудьте закрыть Scanner, когда вы его больше не используете.

Смотрите обновленный код, как показано ниже:

public class Chatbot { 


    public Chatbot() 
    { 
    } 

    /* 
    * Generates a variety of responses, based on what the user has stated 
    */ 
    public void respond(String statement) 
    {   
     // use the findKeyword method to check for various cases of user statements 
     if(statement.length() == 0) 
     { 
      System.out.println("Please say something :)"); 
     } 

     else if(findKeyword(statement, "hi") > 0 || 
      findKeyword(statement, "hello") > 0 || 
      findKeyword(statement, "hey") > 0 || 
      findKeyword(statement, "hiya") > 0 || 
      findKeyword(statement, "heya") > 0) 
      { 
       System.out.println("Hello to you too!"); 
      } 

     else if(findKeyword(statement, "how are you") > 0 || 
       findKeyword(statement, "hows it going") > 0 || 
       findKeyword(statement, "howre you") > 0 || 
       findKeyword(statement, "how ya doing") > 0 || 
       findKeyword(statement, "yo wassup") > 0 || 
       findKeyword(statement, "hey whats up") > 0 || 
       findKeyword(statement, "whats up") > 0) 
      { 
       System.out.println("I'm good, how are you?"); 
      } 
    } 



    /* 
    * findKeyword method, returns either a 0 or a 1 
    * @ 0 -- keyword not found 
    * @ 1 -- keyword found 
    */ 
    public int findKeyword(String statement, String keyword) 
    { 

       // This is in case the keyword is not in the statement at all 
     if(!statement.contains(keyword)) 
     { 
      return 0; 
     } 


     int position = statement.toLowerCase().indexOf(keyword.toLowerCase());  // position of the keyword in the statement 
     statement = " " + statement.toLowerCase().replaceAll("\'\",.?", "") + " ";     // the purpose of this statement is to allow for us to search for specific phrases w/ spaces before and after the keyword 

     String sub = statement.substring(position, position + keyword.length() + 2); // isolates the keyword with 1 character before and after 

     String charBeforeKeyword = sub.substring(0, 1);        // the character before the keyword 
     String charAfterKeyword = sub.substring(sub.length() - 1, sub.length());  // the character after the keyword 



     /* 
     * Now, we check to see if the characters we isolated before are letters; if they are  * 
     * @ If they are letters...then our keyword is part of a bigger word (e.g. if we searched for "success" and it brought us "successful" 
     * @ If they are not letters, then we have found our keyword with punctuation and/or spaces before/after it 
     */ 
     if((charBeforeKeyword.compareTo("a") < 0 || charBeforeKeyword.compareTo("z") > 0) 
       && (charAfterKeyword.compareTo("a") < 0 || charAfterKeyword.compareTo("z") > 0)) 
     { 
      return 1; 
     } 

     return 0; 

    } 


} 

а также Execute класс.

import java.util.Scanner; 

public class Execute 
{ 
    public static void main(String [] args) 
    { 
     // Variables and Objects 
     Chatbot bot = new Chatbot(); 
     Scanner input = new Scanner(System.in); 
     String statement = ""; 

     // Prompt and get the user's first input 
     System.out.println("Type text to start chatting!"); 
     statement = input.nextLine(); 

     // While the user doesn't say goodbye or some other form of it, respond to user and then get their next response 
     while(bot.findKeyword(statement, "bye") != 1 && 
       bot.findKeyword(statement, "cya") != 1 && 
       bot.findKeyword(statement, "goodbye") != 1 && 
       bot.findKeyword(statement, "gtg") != 1) 
     { 
      bot.respond(statement); 
      statement = input.nextLine(); 
     } 
     input.close(); 
     System.out.println("Goodbye!"); 
    } 
} 
+0

Ничего себе, этот близкий метод довольно чертовски важен, да? Полностью изменилась работа моей программы. – AleksandrH

+0

На самом деле, +2 не нужно, не так ли? Предположим, что у вас есть строка ABCD с ключевым словом «BC», таким образом, позиция = 1, длина ключевого слова = 2, позиция + длина + 1 = 4, которая включает символ после ключевого слова. – AleksandrH

0

Вы можете попробовать поставить "слова" инициализированы в строке слово

пример

public class Chatbot { 


    public Chatbot() 
    { 
     String hi= "hi" 
     String hello= "Hello" 
     String hey= "Hey" 
     String hiya= "Hiya" 
     String heya= "Heya" 
     String n; 



    } 

    /* 
    * Generates a variety of responses, based on what the user has stated 
    */ 
    public static void respond(String statement) 
    {   
     // use the findKeyword method to check for various cases of user statements 
     if(n = sc1.next()== "") 
     { 
      System.out.println("Please say something :)"); 
     } 

     else if(findKeyword(statement, hi) || 
      findKeyword(statement, hello) || 
      findKeyword(statement,hey) || 
      findKeyword(statement, hiya) || 
      findKeyword(statement, heya)) 
      { 
       System.out.println("Hello to you too!"); 
      } 

это мое предположение, хотя ...