为什么我在ArrayList而不是整数值中得到这个结果?

时间:2013-11-08 18:26:31

标签: java arraylist

您好,感谢您所有人的帮助。

我正在制作一个集中游戏作为学习项目。我在随机生成器工作权方面遇到了一些问题,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]

我的问题是为什么我得到疯狂的数字而不是实际的整数,我该如何解决这个问题?

因为我必须做以下事情:

  1. 存储结果
  2. 复制结果
  3. 随机播放ArrayList
  4. 在需要使用时检索值
  5. 到目前为止,我试图存储结果,看起来它看起来不像我期望的那样,然后我必须弄清楚如何在ArrayList中复制结果。

    我的GitHub项目:Here

4 个答案:

答案 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可能不需要在内部调整大小。