在下面的(错误)代码中,我希望初始化数组cards中包含的对象,以创建一个桥面。有什么方法可以通过增强的for循环来完成,还是让我使用“标准”for循环?
cards = new Card[SUITS][RANKS];
for(Card[] suit : cards) {
for(Card card : suit) {
card = new Card(suitVar, rankVar);
}
}发布于 2015-02-19 19:38:21
不,这是不可能的,因为增强的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数组是作为数组实现的,并且使用数组引用,所以可以使用增强的for循环初始化外部数组,只要内部数组是用“传统”循环初始化的。这是因为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);
}
}发布于 2015-02-19 19:33:17
不,你不能用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-循环.
发布于 2015-02-19 19:45:01
对于这个特殊的例子,一个很好的策略是创建适合西装和级别的enum。然后,你可以通过循环这些来初始化一个甲板。
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));
}
}这允许您在enum上使用增强的enum循环,而不是卡片本身的数组。它也能更好地表达你想要建模的系统。因此,它在很大程度上取决于具体情况,但这可以应用于不仅仅是带有西装和等级的牌。这是否适当,应视具体情况而定。
因此,要更直接地回答这个问题:不是你所做的方式,而是通过另一种(在这种情况下,更好的)模型,它成为可能。
https://stackoverflow.com/questions/28615159
复制相似问题