2016-04-29 24 views
1

IM編碼聊天博特聲明,他的回答我提出以下方法方法:如果參數目前

// 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?

有人知道如何處理這個問題嗎?

回答

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" : ""); 
0

如果我正確地理解你的問題,也許一個集合將是一個不錯的選擇。

而不是使用字符串...使用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,所以你可以直接使用索引來刪除一個元素。

+1

什麼是myhashSet? –

+0

因爲我複製了代碼xD修復它,謝謝 – dquijada

+0

這對如何有條件地包含答案中的答案有幫助? –

1

你可以嘗試這樣的:
散列圖存儲答案和一個計數器。
在生成隨機響應之前,只允許計數器爲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; 
}