如何修改其他班级的arraylist? Java的

时间:2013-12-16 03:26:56

标签: java arraylist

我正在写一个扑克游戏,并将所有卡存储在Deck类中创建的arraylist中:

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);
        }
    }
}

。 。

我想要另一个类 - 手工绘制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);
    }
}

。 。 。 到现在为止还挺好。当我从主类中显示手ArrayList时,我得到了牌组中的前五张牌。但是,当我从Deck类显示牌组时(在调用Draw()方法之后),所有52张牌仍在那里。

如果我在Hand类中创建了一个getDeck()方法并调用它,那么前五张牌会按预期删除...

所以我觉得这两个班级之间有单向交流;当我从Hand类修改ArrayList时,Deck类不知道它,并且似乎每个类都保留了ArrayList的单独版本。这是怎么回事?

3 个答案:

答案 0 :(得分:3)

每个Hand都有自己的Deck。你想在很多人手中分享一个Deck

我想你想要这样的东西:

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();

FYI

  1. Java约定是小写方法(例如Draw)。
  2. 在中初始化变量构造函数通常更清晰。
  3. 通常首选声明List<Card> myHand,因为它具有更高的抽象级别。

答案 1 :(得分:0)

我会在您的Hand方法Draw()中尝试这一点,该方法应该真正命名为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.

答案 2 :(得分:0)

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

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;
    }

通过这种方式,您可以保护Cards的内部状态,同时提供其他对象与您的Deck进行互动的能力

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