2016-02-04 77 views
0

在我的遊戲中,用戶將能夠合併項目,如果兼容將產生項目新項目。項目ID保存爲int。在遊戲中合併項目

我想知道什麼是最有效的方式做到這將是,同時確保交換順序將始終產生相同的結果,所以用戶可以輸入命令:

item X + item Y = item Z 
item Y + item X = item Z 

我最初以爲的做一些簡單的像一個開關:

private int findItem(id1, id2) 
{ 
    int newID = 0; 
    switch(id1) 
    { 
      case 1: 
      if(id2.equals(4)) 
       newID = 9;//Item 1 + Item 4 = Item 9 
      break; 
    } 
    return newID 
} 

但是,我不知道該用開關是最有效(或整潔),我不得不在事件創造另一種情況,該函數接收項目ID的順序相反。我還必須在案件中有案例來評估「id1」可以結合的所有內容。

是否有一種簡單的方法可以在保持高效的同時不會跨越1000條線路?

+2

使用'=='比較基本類型值 – haifzhan

+0

使用一些巧妙的數學來選擇IDS,執行一個簡單的加法和從獲取返回的項目一個Map '。 – Kayaman

+0

有多少種可能的物品? –

回答

3

我建議使用Map<Set<Item>, Item>來存儲食譜。它的關鍵是一系列需要的物品(那可能超過兩個物品的數量),而它的價值就是製作物品。

然後,您可以使用.containsKey(Set<Item>)方法檢查配方是否存在,並通過其.get(Set<Item>)方法獲得製作結果。

請注意,您的物品必須覆蓋Object.hashCode()才能使此解決方案發揮作用。

這裏是一個小的代碼段的情況下,它不是那麼清楚:http://ideone.com/MbnsrC

+1

這樣,您可以在一個單獨的文件中定義食譜,並使用它來填充地圖,而不是將其作爲代碼的一部分。 –

+0

您提供的代碼示例確實幫助我理解了這個概念,並且我能夠調整它並使其發揮作用!這個解決方案是否可以用來確定食譜退貨項目,還是巧合的是,它們可以共享相同的散列或者一個相似的問題? **編輯**:您對我以前的評論做出了迴應,但我已將其更改爲字符串。對困惑感到抱歉。我現在將此標記爲已解決。 – dinorider

+0

由於它的int類型只有很多獨特的值,因此hashcodes在理論上不能保證在足夠大的集合(如所有可能的字符串的無限集合)上的身份。在實踐中,除非算法很差,否則不得不使用相同的哈希碼獲得兩個不同的項目。如果你需要保證平等,equals()就是你需要的。 – Aaron