我正在编写一个Chat-Bot,为了他的答案,我按照以下方法制作了方法:
// 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");
这显然不起作用。
我想我需要一个if语句outisde,但是有很多情况,因为我有大约50个标准问题,所以我必须为每个案例制作一个,就像我不知道的那样.. 50 + 49 + 48 ... + 2 + 1?
有人知道如何处理这个问题吗?
答案 0 :(得分:1)
你不能直接这样做。
您可以做的是有条件地将字符串插入列表中:
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" : "");
答案 1 :(得分:1)
您可以尝试这样的事情:
存储答案的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;
}
答案 2 :(得分:0)
如果我理解你的问题是正确的,那么Set可能是一个不错的选择。
而不是使用String ...使用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,这样您就可以使用索引直接获取和删除元素。