当前位置: 首页 > 知识库问答 >
问题:

如何修改来自不同类的数组列表?Java

周泰
2023-03-14

我正在编写一个扑克游戏,并将所有的牌存储在类Deck中创建的数组列表中:

public class Deck {

ArrayList<Card> deck = new ArrayList<Card>();

Deck(){  //Build the deck in order.

    for(int suit = 1; suit <= 4; suit++){
        for(int rank = 1; rank <= 13; rank++){
            Card card = new Card(rank, suit);
            deck.add(card);
        }
    }
}

...

我想使用另一个类--Hand--从arraylist中绘制前五个元素,并将它们放入名为myHand的新arraylist中:

public class Hand {

ArrayList<Card> myHand = new ArrayList<Card>();
Deck deckObject = new Deck();

public void Draw(){ //Draws the top 5 cards of the deck and puts them in your hand ArrayList.
for(int i = 0; i <= 4; i++){
    myHand.add(deckObject.deck.get(0));
    deckObject.deck.remove(0);
    }
}

。。。到目前为止一切顺利。当我显示主类的手数组列表时,我得到了一副牌中的前五张牌。然而,当我从deck类显示这副牌时(在调用Draw()方法之后),所有52张牌仍然在那里。

如果我在Hands类中创建一个getDeck()方法并调用它,前五张卡将按预期删除...

所以我似乎在这两个类之间进行了单向通信;当我从手类修改ArrayList时,Deck类不知道它,似乎每个类都保留了一个单独版本的ArrayList。这是怎么回事?

共有3个答案

乌灿
2023-03-14
匿名用户

一般来说,您不希望任何人干扰您对象的内部状态。相反,您希望提供允许其他对象与其交互的方法,例如...

public class Deck {

    private ArrayList<Card> deck = new ArrayList<Card>();

    Deck(){  //Build the deck in order.

        for(int suit = 1; suit <= 4; suit++){
            for(int rank = 1; rank <= 13; rank++){
                Card card = new Card(rank, suit);
                deck.add(card);
            }
        }
    }

    public Card[] draw(int count) {
        Card[] cards = new Card[count];
        if (count < deck.size()) {
            for(int i = 0; i < count; i++){
                cards[i] = deckObject.deck.remove(0);
            }        
        } else {
            throw new IllegalStateException("Can not with draw " + (count + 1) + " from deck that only has " + deck.size() + " cards");
        }
        return cards;
    }

这样,您可以保护< code >卡片的内部状态,同时提供其他对象与您的< code >卡片组进行交互的能力

这也涉及单个地方内的管理和逻辑,因此它总是相同的。。。

宣高朗
2023-03-14

我将在您的<code>手动<code>方法<code>Draw()。

    if (deckObject.deck.size() > 0) {        // Are there cards in the deck?
      myHand.add(deckObject.deck.remove(0)); // add the card removed from 
                                             // the deck to the Hand.
    } else {
      break;                                 // No cards.
    }
    // deckObject.deck.remove(0);            // Already taken care of.
马飞
2023-03-14

牌都有自己的套牌。您想在多只手之间共享一个套牌

我想你想要这样的东西:

public class Hand {

    Deck deck;
    ArrayList<Card> myHand = new ArrayList<Card>();

    Hand(Deck deck) {
        this.deck = deck;
    }

    public void removeCard(Card card) {
        deckObject.deck.remove(card);
    }

    public void Draw() {
        for(int i = 0; i <= 4; i++) {
            myHand.add(deckObject.deck.get(0));
            deckObject.deck.remove(0);
        }
    }
}

然后

Deck deck = new Deck();
Hand hand1 = new Hand(deck);
Hand hand2 = new Hand(deck);
hand1.Draw();
hand2.Draw();

仅供参考

  1. Java约定是小写方法(例如绘制)。
  2. 在构造函数中初始化变量通常更清晰。
  3. 声明列表

 类似资料:
  • 问题内容: 我有一个带有Tag列的表,其中包含大约1000个不同的标签。我想为每个不同的标签创建一个带有列的新表,该列名称将是标签值。使用T- SQL是否有一种简便的方法来做到这一点?SQL Server 2005及更高版本中的任何内容都可以。 这是我的意思的示例: 更新: 我知道限制(在表中的列数上),但是列不会稀疏,并且任何列中都不会有null或0值。 我想要此表的原因是我想针对此新表的列运行

  • 问题内容: 当要依赖的测试与具有此批注的测试属于同一类时,批注的属性可以正常工作。但是,如果要测试的方法和依赖的方法位于不同的类中,则该方法不起作用。示例如下: 有什么办法可以解决这个限制?一种简单的解决方法是在该调用中创建测试。但这将是过多的重复。 问题答案: 将方法放在中并使用。 建议验证*中的配置,并在该处出现问题时抛出错误,以使测试无法运行。这样,测试可以只关注测试。

  • 问题内容: 我试图设置一个不可修改的。 在我的代码中,我有一个返回列表的方法。 此列表不应该修改,但我不想捕获unmodifiableList返回的异常。 它是现有代码,我必须对其进行转换以返回不可修改的列表,但是如果调用了“ add”方法,则不必捕获任何异常。 首先,我创建一个类,该类实现List来覆盖“ add”方法以记录异常而不是捕获异常。 但是我不知道如何正确地实例化它。 问题答案: 如果

  • 问题内容: 我尝试了上面的代码,看是否可以重新分配最终数组的变量[ ans :it可以是]。我知道,通过最终Integer []数组,这意味着我们无法分配除拥有的Integer []之外的另一个实例。我想知道是否有可能使数组变量也不能修改。 问题答案: 据我所知这是不可能的。 但是,有一个Collections.unmodifiableList(..)方法可创建例如的不可修改视图。 如果要保证甚至

  • 为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

  • 我想创建一个程序,允许用户删除员工与指定的工资单号码。 java(在其名为的包中) 当我输入工资单号码时,我的程序只识别第一个工作人员。任何其他工作人员都不会被‘发现’。我在哪里出了问题?如何从数组中删除特定的工资单号码并向用户请求另一个输入(直到数组为“空”)。