在下面的(错误的)代码中,我想对数组cards
中包含的对象进行初始化以创建一个套牌。有没有办法通过增强的for循环或我使用"标准" for loop?
cards = new Card[SUITS][RANKS];
for(Card[] suit : cards) {
for(Card card : suit) {
card = new Card(suitVar, rankVar);
}
}
答案 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;环。这是有效的,因为suit
是cards
中的数组,因此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
循环,而不是卡本身的数组。它也是您尝试建模的系统的更好表示。因此,它在很大程度上取决于具体情况,但这不仅适用于具有诉讼和等级的卡片。这是否合适应根据具体情况确定。
所以要更直接地回答:不是你这样做的方式,而是使用另一种(在这种情况下,更好的)模型,它变得可能。