尽管创建了单独的元素,但整个ArrayList包含相同的对象。添加...?

时间:2014-05-31 22:02:37

标签: java for-loop arraylist reference iteration

  • 我只是想以此为基础,我完成了我的研究和研究。在这里和这里发现了很多关于这个问题的文章。在其他网站上
  • 示例包括:

How to populate an array list in a while loop

Pass by value/reference, what?

Java ArrayList Deck Class

Create several new objects within a for-loop in Java

这些帮助我确定了我的问题,但每个线程上没有太多关于如何绕过它或解决它的问题。我认为这是可能的。 无论如何,简而言之,我正在创建一个使用两个类的卡片组程序,

  1. '卡'(代表卡片中的单张卡片,&
  2. 'Deck'(代表52个卡片对象的容器, - 稍后将包含洗牌,交易等方法)。
  3. 使用下面的代码,我正在设置一个Deck对象&实例化一个ArrayList,我使用两层for循环填充Card对象。如果我在迭代时遇到Sysout,它会说明对象正在使用正确的值“创建”,但是在循环结束时,调用ArrayList上的Card toString()方法会显示52个Club of Clubs对象 - 这是最后一个卡被“创造”。显然它不会创建52个单独的Card对象,而是引用相同的52个对象,&因为最后一次将变量改为俱乐部的Ace,看起来好像有52个。

    当我在Deck构造函数中显式创建一个新的Card对象时,我不明白它们是如何成为同一个对象的。任何帮助我需要重构以在我的Arraylist中实现52个不同的对象,每个对象的各自的等级/套装都正确填充,将非常感激。

    为了便于清楚,我已经将我的程序剥离回仅导致此问题的简单代码

    提前欢呼。

    import java.util.ArrayList;
    
    
    
    public class Deck {
            ArrayList<Card> mainDeck;
    
        public Deck(){
        mainDeck = new ArrayList<>();
        for(int x = 1;x<=4;x++){
            for(int y = 2;y<=14;y++){
                mainDeck.add(new Card(y, x));
            }
        }   
    }
    
    public void listCards(){
        System.out.println(mainDeck.toString());
    
        }
    
    /** I have also tried the below method, which also fails!
     * 
     *  public Deck(){
        mainDeck = new ArrayList<>();
        for(int x = 1;x<=4;x++){
            for(int y = 2;y<=14;y++){
            Card card = new Card(y, x);
            mainDeck.add(card);
            }
        }   
    }
     * 
     *
     */
    
     }
    
    
    
    public class Card {
        public static int rank;
        public static int suit;
        public static String rankText;
        public static String suitText;
    
    public Card(){
    
    }
    
    public Card(int newRank, int newSuit){
        rank = newRank;
        suit = newSuit;
        switch(newSuit){
        case 1:
            suitText = "Spades";
        break;
        case 2:
            suitText = "Hearts";
        break;
        case 3:
            suitText = "Diamonds";
        break;
        case 4:
            suitText = "Clubs";
        break;
        default:
        break;
        }
        switch(newRank){
        case 2:
            rankText = "Two";
        break;
        case 3:
            rankText = "Three";
        break;
        case 4:
            rankText = "Four";
        break;
        case 5:
            rankText = "Five";
        break;
        case 6:
            rankText = "Six";
        break;
        case 7:
            rankText = "Seven";
        break;
        case 8:
            rankText = "Eight";
        break;
        case 9:
            rankText = "Nine";
        break;
        case 10:
            rankText = "Ten";
        break;
        case 11:
            rankText = "Jack";
        break;
        case 12:
            rankText = "Queen";
        break;
        case 13:
            rankText = "King";
        break;
        case 14:
            rankText = "Ace";
        break;
        }
    }
    public static int getRank() {
        return rank;
    }
    public static int getSuit() {
        return suit;
    }
    public static String getRankText() {
        return rankText;
    }
    public static String getSuitText() {
        return suitText;
    }
    @Override
    public String toString() {
        return "Card: = "+ getRankText() + " of "+ getSuitText() + "\n";
    }
    
    
    
    
    
    }
    
    
    
    public class App 
        {
        public static void main( String[] args )
        {
            Deck thisDeck = new Deck();
            thisDeck.listCards();
        }
    }
    

2 个答案:

答案 0 :(得分:3)

Card类存在问题。所有变量都定义为STATIC,这意味着这些变量与所有Card类对象共享,这就是所有卡显示为相同值的原因。

public class Card {
   public static int rank;
    public static int suit;
    public static String rankText;
    public static String suitText;

您必须将这些变量更改为非静态

public class Card {
   public  int rank;
    public  int suit;
    public  String rankText;
    public  String suitText;

答案 1 :(得分:2)

您的问题是您的卡片字段是静态的。删除static关键字,它应该工作。