您好,感谢您所有人的帮助。
我正在制作一个集中游戏作为学习项目。我在随机生成器工作权方面遇到了一些问题,Jeeter在这个帖子中解决了这个问题。 Jeeter's Solution
这是我用来获取数字并将它们存储到ArrayList
中的代码ArrayList<int[]> al = new ArrayList<int[]>();
int offsetX = 130;
int offsetY = 100;
switch(Game.difficulity){
case EASY:
GameConstants.cardsToDraw = 6;
//generate cards
UniqueRandoms randpEA = new UniqueRandoms(GameConstants.cardsToDraw);
int[] cardsEA = new int[GameConstants.cardsToDraw];
System.out.print("The Picks are: "); //Testing purposes only.
for (int i = 0; i < GameConstants.cardsToDraw; i++) {
cardsEA[i] = randpEA.nextInt(); // grabs the results so they can be manulipated
al.add(cardsEA); // add the results to an ArrayList
System.out.print(cardsEA[i] + ", "); //testing to see what is chosen
// this line just shows the result as cards onscreen.
handler.addcard(new GameCard((offsetX) + i*90, (GameConstants.CENTER_Y - offsetY), cardsEA[i], res));
}
//end of generate cards
System.out.print("\n");
System.out.println("Contents of al: " + al);
Game.state = GameState.EASY_GAME;
break;
这是保持这篇文章简短的简单代码块。
当我运行程序时结果如下:
要绘制的牌:6
精选是:5,2,4,1,3,6,
al的内容:[[I @ 44d74990,[I @ 44d74990,[I @ 44d74990,[I @ 44d74990,[I @ 44d74990,[I @ 44d74990]
我的问题是为什么我得到疯狂的数字而不是实际的整数,我该如何解决这个问题?
因为我必须做以下事情:
到目前为止,我试图存储结果,看起来它看起来不像我期望的那样,然后我必须弄清楚如何在ArrayList中复制结果。
我的GitHub项目:Here
答案 0 :(得分:0)
您需要手动遍历ArrayList,然后遍历列表中的每个数组以打印每个值。你需要做的是:
System.out.print("Contents of al: ");
for(int[] ia: al){
for(int i: ia)
System.out.print(i + ", ");
}
System.out.println();
它现在正在做的是打印列表中每个数组的引用。
答案 1 :(得分:0)
尝试打印al.toString()
而不是al
al.toString()
会将其内容格式化为可读形式。
编辑:但如果al
包含int[]
,请按照托马斯发布的答案
答案 2 :(得分:0)
事实: 1)ArrayList不能存储基元,因此整数存储为整数包装器
2)疯狂的数字是各个Integer对象的内存引用,并且由于某种原因,该对象的toString()实现返回内存位置
因此你必须循环ArrayList并使用get()来获取值
编辑:
刚注意到
cardsEA[i] = randpEA.nextInt(); // grabs the results so they can be manulipated
al.add(cardsEA);
您需要将其更改为
cardsEA[i] = randpEA.nextInt(); // grabs the results so they can be manulipated
al.add(cardsEA[i]);
获得所需的结果
答案 3 :(得分:0)
通过这个小片段:
for (int i = 0; i < GameConstants.cardsToDraw; i++) {
cardsEA[i] = randpEA.nextInt();
al.add(cardsEA);
看起来你想要做的就是没有ArrayList<int[]>
,因为你现在拥有的是数组的ArrayList。通过在每次迭代中执行al.add(cardsEA);
,您只需重复将相同的数组添加到列表中。当您尝试打印列表时,每次在循环中添加它时,您将获得该数组的内存地址。这似乎是你想要的:
ArrayList<Integer> al = new ArrayList<Integer>(0);
然后将循环中的行更改为:
al.add(cardsEA[i]);
虽然如果是这种情况,您根本不需要创建数组。您可以将循环更改为:
for (int i = 0, card; i < GameConstants.cardsToDraw; i++) {
card = randpEA.nextInt();
al.add(card);
System.out.print(card + ", ");
handler.addcard(new GameCard((offsetX) + i*90, (GameConstants.CENTER_Y - offsetY), card, res));
或者,如果你想要数组和列表,你可以做的是:
Integer[] cardsEA = new Integer[GameConstants.cardsToDraw];
然后在循环之后不要费心使用列表并执行以下操作:
// declaration
List<Integer> al;
// after the loop
al = Arrays.asList(cardsEA);
或者,如果您需要ArrayList引用而不是List,请执行以下操作:
// declaration
ArrayList<Integer> al;
// after the loop
al = new ArrayList<Integer>(Arrays.asList(cardsEA));
或者:
// declaration
ArrayList<Integer> al = new ArrayList<Integer>();
// after the loop
al.addAll(Arrays.asList(cardsEA));
从阵列中制作列表的方法很多。如果要将列表创建为空,请尽可能将其实例化为new ArrayList<Integer>(GameConstants.cardsToDraw)
,因为ArrayList可能不需要在内部调整大小。