【问题标题】:How to provide new name for object in a loop?如何在循环中为对象提供新名称?
【发布时间】:2014-02-23 21:29:28
【问题描述】:

所以我有一个名为 PlayingCard 的类,它创建一个包含 int rank 和 int suit 的对象(以模拟扑克牌)。

public class PlayingCard 
{
private int rank;
private int suit;


public PlayingCard(int rank1, int suit1) //PlayingCard Constructor
{
    rank = rank1;
    suit = suit1;
}


public int getRank() //Get method to retrieve value of card Rank
{
   if(rank >0 && rank <15)
   {
       return rank;
   }
   else
       return 0;
}


public String getSuit() //Get method to retrieve value of card Suite
{

    while (suit >0 && suit <5)
    {
        if (suit == 1)
        {
            return "Clubs";
        }
        else if (suit == 2)
        {
            return "Diamonds";
        }
        else if (suit == 3)
        {
            return "Hearts";
        }
        else
        {
            return "Spades";
        }
    }

    return "Invalid suit";
}


@Override //Overrides default Java toString method
public String toString()
{
    String strSuit = "";

    switch(suit) 
    {
        case 1: strSuit = "Clubs";
            break;
        case 2: strSuit = "Diamonds";
            break;
        case 3: strSuit = "Hearts";
            break;
        case 4: strSuit = "Spades";
            break;
        default: strSuit = "Invalid Suit";
            break;
    }

    String output = getClass().getName() + "[suit = " +strSuit + ", rank = "
                    +rank + "]";

    return output;
}


public String format() //Allows individual cards to be displayed in a
{                     //Specific format.
    String strSuit = "";

    switch(suit) 
    {
        case 1: strSuit = "Clubs";
            break;
        case 2: strSuit = "Diamonds";
            break;
        case 3: strSuit = "Hearts";
            break;
        case 4: strSuit = "Spades";
            break;
        default: strSuit = "Invalid Suit";
            break;
    }

    return rank + " of " + strSuit + ", ";
}

@Override
public boolean equals(Object y) //Method for evaluating Object equality.
{

    if (getClass() != y.getClass()) //Checks if both object are from the
    {                              //Same class.
        return false;
    }

    if (y == null) //Checks if second object is empty or non-existent.
    {
        return false;
    }

    PlayingCard other = (PlayingCard) y;
    return rank == other.rank && suit == other.suit;
}
}

然后我需要创建一个名为 PackBuilder 的程序,它应该模拟使用我的类构建一副纸牌。

问题是我不确定如何给每个对象起一个新名称。我想到了这样的数组:

while(rank < 15)
        {
            PlayingCard cardDeck[1] = new PlayingCard(rank, suit);
        }

但它说 cardDeck 已经定义(我不确定我是否做错了,或者如果使用数组不起作用)

我想要的名称方案类似于“card1”“card2”“card3”等等,直到我有 52 张卡片,每张卡片都有自己的套装/等级组合来创建一副卡片。

【问题讨论】:

  • 数组索引没有也不能有名字。数组索引使用数字访问。

标签: java class


【解决方案1】:

您正尝试将PlayingCard 分配给cardDeck 数组中的第二个元素(索引1),每次。此外,cardDeck 数组会在您的 while 循环的每次迭代 的底部立即被丢弃。它只存在于循环内部。

改变这个

while(rank < 15)
    {
        PlayingCard cardDeck[1] = new PlayingCard(rank, suit);
    }

这样的事情

PlayingCard[] cardDeck = new PlayingCard[52];

int i = 0;
while(rank < 15)
    {
        cardDeck[i++] = new PlayingCard(rank, suit);
    }

为避免无限循环,请更改

cardDeck[i++] = new PlayingCard(rank, suit);

cardDeck[i++] = new PlayingCard(rank++, suit);

可能还有其他问题,但这是一个很好的开始。

【讨论】:

  • 这个对象/数组分配问题是我在这里解决的唯一问题。在这个更大的问题得到解决之前,更新排名没有实际意义。
  • 是的。确实如此。我马上就解决它。
【解决方案2】:

你必须使用一个类吗?最好将其作为一组 3 个枚举来执行。您检查数字并为西装返回字符串的 get 方法是各种错误的。如果套件是一个枚举,您可以通过名称和编号(序数)来引用它。

两个嵌套循环是构建部分的最简单解决方案。

但是,如果您想要一副已命名的牌,例如,您可以说“如果 card==QueenOfSpades,您将不得不做一些更有创意的事情,例如嵌套循环,您从等级和西装中获取名称,并将它们与介于两者之间的 Of 连接起来。这就是使这个问题变得有趣的原因:显然你不能这样做。您不能以编程方式命名枚举。

这意味着你可以让你的 Deck 枚举有 52 个命名元素,例如DeuceOfSpades、DeuceOfHearts 到 AceOfSpades 等。

另一种选择是对等级和花色进行枚举,然后让类牌组生成卡片,并将它们放在里面,然后有办法按名称获取卡片,例如甲板.getAceOfHearts()。然后它也可以通过某种迭代器接口随机提供卡片,例如getNextCard()。

【讨论】:

    【解决方案3】:

    一副牌(为方便起见):
    假设每个花色有 14 张牌(我不知道确切的等级数,我假设是 14)

    给定牌的等级和花色,你可以通过cardDeck[(rank-1)*4 + (suit-1)]得到它

    PlayingCard cardDeck = new PlayingCard[56];
    
    int rank, suit, i = 0;
    
    for(rank=1; rank<=14; rank++)
    {
    
      for(suit=1; suit<=4; suit++)
    
      cardDeck[i++] = new PlayingCard(rank, suit);    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多