是否可以通过增强的for循环初始化数组中的对象?

时间:2015-02-19 19:27:31

标签: java arrays loops for-loop

在下面的(错误的)代码中,我想对数组cards中包含的对象进行初始化以创建一个套牌。有没有办法通过增强的for循环或我使用"标准" for loop?

cards = new Card[SUITS][RANKS];

for(Card[] suit : cards) {
    for(Card card : suit) {
        card = new Card(suitVar, rankVar);
    }
}

3 个答案:

答案 0 :(得分:2)

不,这是不可能的,因为增强的for循环将提供对当前元素的引用。将新对象分配给引用不会将元素分配给数组。没有什么可以替代使用数组访问表达式将元素分配给数组。

你可以使用两个"传统" for循环使用数组访问表达式来初始化数组。

for (int s = 0; s < SUITS; s++)
   for (int c = 0; c < RANKS; c++)
       cards[s][c] = new Card(...);

可以使用数组初始化程序,但它会冗长乏味,过于冗长,容易出错。

cards = new Card[][] {
  {new Card(...), new Card(...), ... },
  {new Card(...), new Card(...), ... },
  ...};

有趣的是,因为2D数组是作为数组的数组实现的,并且使用了数组引用,所以 outer 数组可以使用增强的for循环进行初始化,只要内部数组初始化为&#34;传统&#34;环。这是有效的,因为suitcards中的数组,因此suit[c]cards中的元素。

cards = new Card[SUITS][RANKS];

for(Card[] suit : cards) {
    for(int c = 0; c < RANKS; c++) {
        suit[c] = new Card(suitVar, rankVar);
    }
}

答案 1 :(得分:0)

不,你不能使用foreach。
这主要是因为每个都是只读的,还因为你会覆盖循环中对象的引用。 Java没有这种方式工作。好吧,我不知道一种面向对象的语言,这会起作用。

你可以用这个简单的例子来测试它:

String[] strings = new String[10];
for(String s: strings)
    s = "This won't work!";

for (String s : strings)
    System.out.println(s);

会打印出来

null
null
null
null
null
null
null
null
null
null

正常的方法是使用正常的for循环。

答案 2 :(得分:0)

对于这个特定的例子,一个好的策略是为套装和等级创建enum s。然后你可以通过循环来初始化一个套牌。

public enum Suit { CLUB, DIAMOND, HEART, SPADE }
public enum Rank {
    ACE,
    TWO,
    ...
    QUEEN,
    KING
}

然后

List<Card> deck = new ArrayList(Suit.values().length * Rank.values.length);
for (Suit s: Suit.values()) {
    for (Rank r: Rank.values()) {
        deck.add(new Card(s, r));
    }
}

这允许您在for上使用增强的enum循环,而不是卡本身的数组。它也是您尝试建模的系统的更好表示。因此,它在很大程度上取决于具体情况,但这不仅适用于具有诉讼和等级的卡片。这是否合适应根据具体情况确定。

所以要更直接地回答:不是你这样做的方式,而是使用另一种(在这种情况下,更好的)模型,它变得可能。