如果声明参数

时间:2016-04-29 08:21:38

标签: java function if-statement arguments

我正在编写一个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?

有人知道如何处理这个问题吗?

3 个答案:

答案 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,这样您就可以使用索引直接获取和删除元素。