Java中ArrayList存储Card对象是否需为每个对象设置唯一名称?
你的Java卡牌作业问题解答
1. 是否需要给每个Card对象设置唯一名称?
不需要。标准卡牌的花色+点数组合本身就能唯一标识一张牌(比如“红桃A”“梅花10”),没必要额外添加唯一名称。你可以在Card类里用两个属性(比如String suit和int rank)存储花色和点数,通过这两个属性的组合区分不同卡牌即可。
2. 如何显示卡牌的点数与花色、调用列表中对象的方法?
首先在Card类中重写toString()方法,用来直接返回卡牌的花色和点数信息;如果需要单独获取属性,再添加对应的get方法。示例代码如下:
public class Card { private String suit; private int rank; // 构造方法 public Card(String suit, int rank) { this.suit = suit; this.rank = rank; } // 重写toString,方便直接打印卡牌信息 @Override public String toString() { // 把数字点数转成A、J、Q、K的格式 String rankStr; if (rank == 1) { rankStr = "A"; } else if (rank == 11) { rankStr = "J"; } else if (rank == 12) { rankStr = "Q"; } else if (rank == 13) { rankStr = "K"; } else { rankStr = String.valueOf(rank); } return suit + rankStr; } // 获取花色的方法 public String getSuit() { return suit; } // 获取点数的方法 public int getRank() { return rank; } }
之后在Deck类或测试类中,遍历存储Card的ArrayList时,直接打印对象或调用其方法即可:
import java.util.ArrayList; public class Deck { private ArrayList<Card> cards; public Deck() { cards = new ArrayList<>(); // 初始化标准52张牌 String[] suits = {"红桃", "方块", "梅花", "黑桃"}; for (String suit : suits) { for (int rank = 1; rank <= 13; rank++) { cards.add(new Card(suit, rank)); } } } // 打印卡组所有卡牌 public void printDeck() { for (Card card : cards) { // 直接打印会自动调用toString() System.out.println(card); // 也可以调用get方法单独获取属性 // System.out.println("花色:" + card.getSuit() + ",点数:" + card.getRank()); } } }
3. 将卡牌从卡组移至玩家手牌后是否会有变化?
不会有变化。你移动的是Card对象的引用,不管在Deck的ArrayList里还是玩家手牌的ArrayList里,指向的都是同一个Card对象。除非你主动修改这个Card对象的属性(比如更改花色或点数),否则卡牌本身的信息完全不会改变。
简单的移动逻辑示例:
// Deck类中添加抽卡方法 public Card drawCard() { if (!cards.isEmpty()) { return cards.remove(cards.size() - 1); } return null; // 卡组为空时返回null } // 测试抽卡到手牌的逻辑 public static void main(String[] args) { Deck deck = new Deck(); ArrayList<Card> playerHand = new ArrayList<>(); // 从卡组抽一张牌加入手牌 playerHand.add(deck.drawCard()); // 此时手牌里的卡牌和之前卡组里的是同一个对象,属性完全一致 }
内容的提问来源于stack exchange,提问作者CynicalBlitz
相关产品推荐
相关产品推荐

