2017-06-04 47 views
-1

我有一個Android卡牌遊戲應用程序。 在我的應用我將數據發送關於已經在玩家之間玩的遊戲卡,我儘量使信息儘可能短。 我有一個代表每張卡片的類。 現在,爲了減小信息,我將每張卡片稱爲單個字符。 例如黑桃王牌將''' 王牌鑽石將'B'等等..如何將chars映射到(玩)卡?

我的問題是,我怎麼能映射字符回到對應的卡,以最有效的方式? (對於字符和卡的示例散列映射) 例如,如果一個播放器接收到「A,B」,他將其轉換爲黑桃和鑽石的ACE。

謝謝!

+1

爲什麼不直接使用switch語句:

如果你想這樣做沒有第三者庫,您可以輕鬆地用做兩個地圖它應該能夠? –

+0

我認爲有50多個案例的開關不會如此有效 – Billy

+0

「有效性」是什麼意思?由於switch語句將被轉換爲跳轉標記,因此它最有可能比HashMaps更好地執行。當然,就可讀性和可維護性而言,轉換語句可能不是最好的。 –

回答

1

我每張卡映射到一個字符以「」(32十進制,十六進制0×20,所以你總是有可打印字符處理),則只是有一個switch語句覆蓋所有的牌。例如,一個開關語句進行編碼,另一個開關語句解碼爲「鑽石王牌」。

雖然冗長,但較大的switch語句比鏈接的if-elseif語句更好,並且比二進制編碼更容易理解。如果我爲一個內存受限的設備做這件事,我可能會選擇二進制編碼,但對於一臺真正的計算機,我只是使用switch,因爲它很容易理解。

0

相信的switch-case/if-else語句是在這種情況下確定。它會變大,但是任何你定義50個映射的代碼都會很大。其他

一種辦法是「專賣店」你的角色< - >卡關係在某種程度上和使用方法來檢索值。您將以易讀的方式獲得關係,並且註冊映射並使用它很容易。

我覺得這是對1地圖:(?BIMAP從谷歌番石榴)1的關係。你可以在地圖上註冊你的角色和卡片,這樣你就可以在兩個方向上進行識別。

/** used to find the correct Card by Character */ 
private final static Map<Character, Card> mapCharToCard = new HashMap<>(); 

/** used to find the correct Character by Card (for sending over network) */ 
private final static Map<Card, Character> mapCardToChar = new HashMap<>(); 

/* Always stores boths ways so you can always map it back and forth */ 
public final static void register(Character character, Card card) { 

    mapCharToCard.put(character, card); 
    mapCardToChar.put(card, character); 
} 

public final static Character map(Card card) { 

    return mapCardToChar.get(card); 
} 

public final static Card map(Character character) { 

    return mapCharToCard.get(character); 
} 

public static void main(String[] args) { 

    register('a', new Card("Spades", "Ace")); 
    register('b', new Card("Heart", "King")); 

    System.out.println(map('a')); 
    System.out.println(map('b')); 

    // Even works with new cards as hashmap uses equals() to check 
    System.out.println(map(new Card("Spades", "Ace"))); 
} 

public static class Card { 

    private String color; 
    private String value; 

    public Card(String color, String value) { 
     super(); 
     this.color = color; 
     this.value = value; 
    } 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String color) { 
     this.color = color; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    public String toString() { 
     return "Card [getColor()=" + getColor() + ", getValue()=" + getValue() + "]"; 
    } 

    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((color == null) ? 0 : color.hashCode()); 
     result = prime * result + ((value == null) ? 0 : value.hashCode()); 
     return result; 
    } 

    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Card other = (Card) obj; 
     if (color == null) { 
      if (other.color != null) 
       return false; 
     } else if (!color.equals(other.color)) 
      return false; 
     if (value == null) { 
      if (other.value != null) 
       return false; 
     } else if (!value.equals(other.value)) 
      return false; 
     return true; 
    } 
}