迭代数组并打印每个对象

时间:2015-05-04 17:59:50

标签: java arraylist

正在加载我的阵列,并按计划打印出卡片(按照它们出现在文件中的顺序)。当我尝试以单独的方法循环回到arraylist以检查数据是否存在时,它只打印最后对象而不是每个对象。谁能告诉我为什么?

加载方法

public class
    TestFrame {

//VARIABLES
private static Deck deck;
private static Card card;
private static Scanner scan;
private final static String fileName = "cards.txt";
static ArrayList<Card> cards = new ArrayList<>();

private static void Load(){

    deck = new Deck();
    card = new Card();

    // Load in the card file so that we can work with the data from cards.txt internally rather than from the file constantly.

    try(FileReader fr = new FileReader(fileName);
            BufferedReader br = new BufferedReader(fr);
            Scanner infile = new Scanner(br)){

        int numOfCards = infile.nextInt();
        infile.nextLine(); // Do we need this? Yes we do. Illuminati confirmed.
        for(int i=0; i < numOfCards; i++){
            String value = infile.nextLine();
            String suit = infile.nextLine();
            Card newCard = new Card(value, suit);
            card.addCard(newCard);
            System.out.print(newCard.getValue());
            System.out.print(newCard.getSuit());
            System.out.println(" ");
            //Print out the object before cycling through again so we can see if it's working
            //We can use this to add then cards to the shuffle array at a later date
        }

    }

运行时打印出来的内容:

ah 
2h 
3h 
4h 
5h 
6h 
7h 
8h 

等等。这是他们在.txt文件中的顺序。

然后我使用这些方法显示所有卡片以确保我可以在别处操作数据

private static void displayAllCards(){
    Card[] cards = Card.getAll();
    for(Card c : cards){
        System.out.print(Card.getValue());
        System.out.print(Card.getSuit());
        System.out.println(" ");
    }
}

和getAll()方法

public static Card[] getAll(){
    Card[] brb = new Card[cards.size()];
    int tempCount = -1;
    for(Card c : cards){
        tempCount++;
        brb[tempCount] = c;
    }
    return brb;
}

getAll()运行时,它只打印出“ks”(黑桃之王),它是.txt文件中的最后一张卡。谁能告诉我为什么会这样?

由于

编辑:卡片类

package uk.ac.aber.dcs.cs12320.cards;

import java.util.ArrayList;


public class Card {

protected static String value;
protected static String suit;
static ArrayList<Card> cardsList = new ArrayList<>();

public Card(String v, String s){
    this.value = v;
    this.suit = s;
}

public Card() {

}

public static Card[] getAll(){
    Card[] brb = new Card[cardsList.size()];
    int tempCount = -1;
    for(Card c : cardsList){
        tempCount++;
        brb[tempCount] = c;
    }
    return brb;
}

public static void deleteAll(){
    cardsList.clear();
}

public static String getValue() {
    return value;
}

public void setValue(String value) {
    Deck.value = value;
}

public static String getSuit() {
    return suit;
}

public void setSuit(String suit) {
    Deck.suit = suit;
}

public void addCard(Card card){
    cardsList.add(card);
}

}

5 个答案:

答案 0 :(得分:6)

card.addCard(newCard);

我认为这应该是cards.addCard(newCard);而不是

答案 1 :(得分:1)

您的卡片类未能很好地实施。您获得最后一个值的原因是因为您的gettersString变量是静态的。每个类只有一个静态变量副本。您需要创建这些实例变量/方法并将打印循环更改为

for(Card c : cards){
    System.out.print(c.getValue());
    System.out.print(c.getSuit());
    System.out.println(" ");
}

有关静态与实例的详细说明,请参阅this answer

答案 2 :(得分:1)

Card中,变量suitvalue被声明为静态。这意味着只有一个变量,在所有卡片之间共享。

加载时,您可以创建一张卡片。您设置suitvalue,因此他们分别获得ha。然后你打印出来。

然后你加载接下来的两行。你创建一张新卡。但变量是静态的,不是新对象状态的一部分,而是包含suitvalue的{​​{1}}和h。新值为a。它取代 2。然后你打印它。旧的价值消失了。

因此,您在加载中的打印显示了asuit的瞬时值,但事实上,只有一个值 - 您从文件中加载的最后一个值。

这些变量应该是卡片状态的一部分,因此,不是静态

注意:当您尝试使用静态上下文中的实例变量时,IDE会注意到。例如,您的value方法是静态的。因此它无法访问实例变量。但是,更正是将变量设置为静态,而是将方法(在逻辑上应该是实例方法)更改为 not < / em> getValue。它可能会再次抱怨因为您从静态上下文调用该方法。然后你必须仔细查看原因:你不应该静态使用这个方法 - 你应该创建一个static的实例并使用你创建的变量调用该方法。

因此,IDE建议&#34;使其静止&#34;不是正确的解决方案!您应该使所有与实例相关的变量和方法静态,并解决&#34;静态上下文&#34;通过检查您没有创建实例的原因并决定静态调用与实例相关的方法来解决问题。

答案 3 :(得分:0)

card.addCard(newCard);看起来可能是cards.add(newCard);,也是一个提示,当你从getAll函数开始为零时,改变你的索引看起来好一点

    public static Card[] getAll(){
    Card[] brb = new Card[cards.size()];
    int tempCount = -1;
    for(Card c : cards){
        tempCount++;
        brb[tempCount] = c;
    }
    return brb;
}

将其更改为

    public static Card[] getAll(){
    Card[] brb = new Card[cards.size()];
    int tempCount = 0;
    for(Card c : cards){
        brb[tempCount] = c;
        tempCount++;
    }
    return brb;
}

答案 4 :(得分:-1)

您在特定卡上呼叫ListFragment,但是在您拥有getAll()之前,您只会在列表中添加一张卡,因为每个card.addCard都有自己的ArrayList。这就是为什么它只打印一卡。您需要在文件中创建的ArrayList上使用getAll()。

在使用Card

的主文件中创建一个getAll()方法
static ArrayList<Card> cards = new ArrayList<>();

这样可行。