How to populate an array list in a while loop
Pass by value/reference, what?
Create several new objects within a for-loop in Java
这些帮助我确定了我的问题,但每个线程上没有太多关于如何绕过它或解决它的问题。我认为这是可能的。 无论如何,简而言之,我正在创建一个使用两个类的卡片组程序,
使用下面的代码,我正在设置一个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();
}
}
答案 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关键字,它应该工作。