我有一个Android卡游戏应用程序。 在我的应用程序中,我发送有关玩家之间已经玩过的游戏卡的数据,并且我尝试使消息尽可能短。 我有一个代表每张卡的课程。 现在,为了使消息更小,我将每张卡称为单个字符。 例如,黑桃的王牌将是'a' 钻石王牌将是'b'等等。
我的问题是,如何以最有效的方式将字符映射回相应的卡? (例如字符和卡片的hashmap) 例如,如果玩家收到'a,b',则会将其翻译成黑桃和钻石。
谢谢!
答案 0 :(得分:1)
我将每张卡映射到以''开头的字符(32位十进制,0x20十六进制,因此您将始终处理可打印字符)然后只需要一个switch语句来覆盖所有卡片。一个用于编码的switch语句,另一个用于解码为“Ace of Diamonds”。例如。
虽然很长,但是大switch
语句比链式if-elseif
语句更好,并且比二进制编码更容易理解。如果我是为一个内存受限的设备做的,我可能会选择二进制编码,但对于真正的计算机,我只使用switch
,因为它很容易理解。
答案 1 :(得分:0)
我相信Switch-case / if-else在这种情况下还可以。它会变大,但是你定义50个映射的任何类型的代码都会很大。
另一种方法是以某种方式“存储”您的角色< - >卡片关系,并使用方法来检索值。您可以通过易于阅读的方式获得关系,并且可以轻松注册映射并使用它。
我认为有1:1关系的地图(来自Googles Guava的BiMap?)。您只需在该地图中注册您的角色和卡片,这样您就可以在两个方向上进行识别。
如果你想在没有第三方库的情况下这样做,你应该可以使用两张地图轻松完成:
/** 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;
}
}