Android / Java使用二维数组创建聊天机器人

时间:2018-03-31 01:00:08

标签: java android chatbot

public class ChatBot {
String[][] chatBot={
        // standard greetings
        { "hi", "hello", "hey" }, { "hi user"},
        // question greetings
        { "how are you" }, { "good"},
        // default
        { "I did not understand. Please try something else" }, };

public ChatBot() {
}

public String checkAnswer(String message) {
    byte response = 0;
    int messageType = 0;
    String x = null;
    List temp;
    int cblength = chatBot.length - 1;
    while (response == 0 && messageType <= cblength) {
        temp = Arrays.asList(chatBot[messageType]);
        if (temp.contains(message)) {
            response = 2;
            x = chatBot[(messageType) + 1][0];
        }

        messageType = messageType + 2;

        if (response == 1) 
            x = chatBot[chatBot.length - 1][0];
        }
    }
    return x;
}

我创建了这个简单的聊天机器人来测试我的聊天应用程序。它使用二维字符串数组来保存可能的输入和输出。 checkAnwer方法接收用户输入,并且应该返回正确的输出。如果字段的内容与数组匹配,它使用while循环检查输入字段并返回相应的输出。如果循环到达数组的末尾,则应该返回默认答案。第一组输入(hi / hello / hey)返回正确的输出(hi用户),但每隔一个输入都会导致while循环超过数组长度。

修改

我删除了代码中的错误,现在接受所有输入,无效输入返回null。

EDIT2

我改变了int cblength = chatBot.length - 1; int cblength = chatBot.length;

messageType = messageType + 2;

    if ((messageType+2)>=cblength)
    {
        response=1;
    }
    else {
        messageType = messageType + 2;
    }

代码现在正常运行。

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的代码,chatBot的长度为5.在while循环的每次完整传递中,messageType递增2.这意味着在第二次传递时,messageType = 2。这意味着在以下一行:

 x = chatBot[(messageType * 2) + 1][0];

我们正在寻找(2 * 2)+1 = 5作为指数。由于列表长度为5,因此最大索引为4,导致IndexOutOfBoundsException。

我可以通过两种主要方式来解决这个问题:

  1. 重新考虑是否确实需要在while循环中重复两次相同的代码块 - 这会增加一些不必要的复杂性,并减少检查while条件的频率。
  2. 更新while条件以检查在迭代期间发生的任何(messageType * 2)+1仍然在数组的范围内。