Java程序迭代超过需要?

时间:2017-05-02 22:42:00

标签: java arraylist runtime-error

我不确定我是否提出了正确的问题,但这个问题与我能想到的一样接近。无论如何,我试图制作一个简化版的Solitaire,称为Elevens。在编译阶段,一切似乎都很好,但是当它完成时,它并没有按预期工作。以下是与此问题相关的DeckDeckTester类的方法:

注意:我遗漏了标题和内容

Deck类构造函数和其中一个方法:

public Deck(String[] suits, String[] ranks, int[] values){
    ArrayList<Card> cardslist = new ArrayList<Card>();
    for(String suit: suits){
        for(String rank: ranks){
            for(int value: values){
                cardslist.add(new Card(suit, rank, value));
            }
        }
    }
    size=cardslist.size();
    cards=cardslist;
}

public List<Card> getDeck(){
    return cards;
}

DeckTester主要方法:

public static void main(String[] args){
    String[] suitsA={"Clubs", "Diamonds", "Hearts", "Spades"};
    String[] ranksA={"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
    int[] valuesA={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
    String[] suitsB={"Lions", "Giraffes", "Wolves"};
    String[] ranksB={"One", "Two", "Three"};
    int[] valuesB={1, 2, 3};
    Deck a = new Deck(suitsA, ranksA, valuesA);
    Deck b = new Deck(suitsB, ranksB, valuesB);
    System.out.println(a.getDeck());
    System.out.println(b.getDeck());
}

这产生了一个数组的结果,如{Ace of Clubs(得分值:1)......俱乐部王牌(积分值:13),两个俱乐部(积分值:1)等}

我希望它像一副标准纸牌一样生产。

2 个答案:

答案 0 :(得分:1)

你有三个嵌套for循环,因此你会使suits*ranks*values多张牌,而你只想让suits*ranks多张牌。因此:

public Deck(String[] suits, String[] ranks, int[] values){
    ArrayList<Card> cardslist = new ArrayList<Card>();
    for(String suit: suits) {
        for(int i = 0; i < ranks.length; i++) {
            cardslist.add(new Card(suit, ranks[i], values[i]));
        }
    }
    size=cardslist.size();
    cards=cardslist;
}

public List<Card> getDeck(){
    return cards;
}

请记住,当您传递它们以正确分配它们并确保它们的长度相同时,您必须按顺序使等级和值对应。您可能希望为此添加警卫。

希望这有帮助!

答案 1 :(得分:0)

制作一副纸牌(52张牌),你有4&#34;套装&#34;和13&#34;排名&#34;为每件衣服。 4 * 13 = 52.但是你为每张正常的卡片制作了#34;每个点值的额外循环?您可以使用enum for suit和enum for rank并使用开关语句(如果您愿意,可以使用 if )为卡片分配值。你不需要额外的循环。你不需要来制作一个枚举。由于你使用字符串,所以完全可以这样做。但是你不应该分配像你现在这样的价值观。例如,您可以将检查值放在卡的构造函数中。