首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >参数中的If语句

参数中的If语句
EN

Stack Overflow用户
提问于 2016-04-29 08:21:37
回答 3查看 97关注 0票数 1

我目前正在编写聊天机器人的代码,对于他的答案,我做了以下方法:

代码语言:javascript
运行
复制
// Choose Randomly From Given Answers
public String chooseAnswer(String... strings){
    int i = (int) strings.length;
    int random = (int)(Math.random() * i); 
    return strings[random];
}

效果很好。现在出现了以下问题:如果机器人不理解用户的话,他会显示一个随机的问题或声明,例如。

代码语言:javascript
运行
复制
chooseAnswer("Sounds great", "Whats your favorite color?", "Whats your favorite food?", "Tell me something");

用户现在可以回答,例如,他最喜欢的颜色是什么。如果他回答了一次,机器人就不应该再选择关于他的颜色的问题了。

我有一个变量,计算用户说了多少次他最喜欢的颜色,所以这不是问题。

现在,如果这样的事情能起作用,那就太好了:

代码语言:javascript
运行
复制
chooseAnswer("Sounds great", if(favorite_color_count == 0){"Whats your favorite color?"}, "Whats your favorite food?", "Tell me something");

这显然是行不通的。

我想我需要一个如果陈述,但有这么多的情况,因为我有大约50个标准的问题,所以我将不得不为每一个案件,而这是我不知道。50+49+48...+2+1?

有人知道怎么处理这件事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-29 08:33:32

你不能直接这么做。

您可以做的是有条件地将字符串插入到列表中:

代码语言:javascript
运行
复制
List<String> answers = new ArrayList<>(Arrays.asList(
    "Sounds great",
    "Whats your favorite food?"));
if (favourite_color_count == 0) {
  answers.add("Whats your favourite color?");
}

然后引用如下:

代码语言:javascript
运行
复制
chooseAnswer(answers.toArray(new String[0]));

这显然是相当冗长的呼叫网站。

另一种方法是将逻辑放入chooseAnswer方法中,这样它就不会选择空(或空)答案。然后可以使用三元操作符:

代码语言:javascript
运行
复制
chooseAnswer(
    "Sounds great",
    "Whats your favorite food?",
    (condition) ? "Whats your favorite color" : "");
票数 1
EN

Stack Overflow用户

发布于 2016-04-29 08:58:59

你可以试试这样的东西:

存储答案和其中一个答案的计数器的Hashmap。

在生成随机响应之前,您只允许计数器位于0的响应。

当您发送响应时,您将更新计数器。

注意:这不是一个非常有效的解决方案,您每次都会在地图上迭代。

代码语言:javascript
运行
复制
Map<String, Integer> myMap = new HashMap<String, Integer>();
myMap.put("Sounds great", 0);
myMap.put("Whats your favorite food?", 0);

public String generateAnswer(String... strings){
    ArrayList<String> possibleAnswers = new ArrayList<String>();
    for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
        int amount = entry.getValue();          
        if (amount == 0) {
            possibleAnswers.add(entry.getKey());
        }
    }
    return chooseAnswer(possibleAnswers);
}

public String chooseAnswer(ArrayList<String> possibleAnswers){

    int i = possibleAnswers.size();
    int random = (int)(Math.random() * i);
    String response = possibleAnswers.get(random);
    myMap.put(response, myMap.get(response) + 1);
    return response;
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-29 08:33:42

如果我正确地理解了你的问题,也许一套是个不错的选择。

而不是用字符串..。使用Set;类似于:

代码语言:javascript
运行
复制
public String chooseAnswer (Set<String> strings) {
    int size = strings.size();
    int item = new Random().nextInt(size); // In real life, the Random object should be rather more shared than this
    int i = 0;

    for(String str : strings)
    {
        if (i++ == item) {
            strings.remove(str);
            return str;
        }
    }
    return null; // You will never reach this, but the IDE/compiler might need you to write this.
}

您只需删除不想重复的问题;您可以创建一个布尔函数来确定是否要重复某个答案,并将删除放在带有该条件的if中;以防您想重复一些问题,但不想重复其他问题。

PS:从集合中获取随机元素的方法来自here

如果不想这样做,另一个选择是只使用ArrayList,这样就可以直接使用索引来获取和删除元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36933220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档