我目前正在编写聊天机器人的代码,对于他的答案,我做了以下方法:
// Choose Randomly From Given Answers
public String chooseAnswer(String... strings){
int i = (int) strings.length;
int random = (int)(Math.random() * i);
return strings[random];
}效果很好。现在出现了以下问题:如果机器人不理解用户的话,他会显示一个随机的问题或声明,例如。
chooseAnswer("Sounds great", "Whats your favorite color?", "Whats your favorite food?", "Tell me something");用户现在可以回答,例如,他最喜欢的颜色是什么。如果他回答了一次,机器人就不应该再选择关于他的颜色的问题了。
我有一个变量,计算用户说了多少次他最喜欢的颜色,所以这不是问题。
现在,如果这样的事情能起作用,那就太好了:
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?
有人知道怎么处理这件事吗?
发布于 2016-04-29 08:33:32
你不能直接这么做。
您可以做的是有条件地将字符串插入到列表中:
List<String> answers = new ArrayList<>(Arrays.asList(
"Sounds great",
"Whats your favorite food?"));
if (favourite_color_count == 0) {
answers.add("Whats your favourite color?");
}然后引用如下:
chooseAnswer(answers.toArray(new String[0]));这显然是相当冗长的呼叫网站。
另一种方法是将逻辑放入chooseAnswer方法中,这样它就不会选择空(或空)答案。然后可以使用三元操作符:
chooseAnswer(
"Sounds great",
"Whats your favorite food?",
(condition) ? "Whats your favorite color" : "");发布于 2016-04-29 08:58:59
你可以试试这样的东西:
存储答案和其中一个答案的计数器的Hashmap。
在生成随机响应之前,您只允许计数器位于0的响应。
当您发送响应时,您将更新计数器。
注意:这不是一个非常有效的解决方案,您每次都会在地图上迭代。
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;
}发布于 2016-04-29 08:33:42
如果我正确地理解了你的问题,也许一套是个不错的选择。
而不是用字符串..。使用Set;类似于:
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,这样就可以直接使用索引来获取和删除元素。
https://stackoverflow.com/questions/36933220
复制相似问题