0

您好,感谢大家的帮助。

我正在制作一个专注游戏作为一个学习项目。我在随机生成器正常工作时遇到了一些问题,Jeeter 在这个线程中解决了这些问题。吉特的解决方案

这是我用来获取数字并将它们存储到 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. 当我需要使用它们时检索这些值

到目前为止,我正在尝试存储结果,但它看起来不像我期望的那样,然后我必须弄清楚如何在 ArrayList 中复制结果。

我的 GitHub 项目:这里

4

4 回答 4

0

您需要手动循环遍历 ArrayList,然后遍历列表中的每个数组以打印每个值。你需要做的是:

 System.out.print("Contents of al: ");
 for(int[] ia: al){ 
    for(int i: ia)
       System.out.print(i + ", ");
 }
 System.out.println();

它现在所做的是打印列表中每个数组的引用。

于 2013-11-08T18:27:54.060 回答
0

尝试打印al.toString()而不是al

al.toString()将其内容格式化为可读形式。

编辑:但如果al包含int[]遵循托马斯发布的答案

于 2013-11-08T18:31:13.557 回答
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]);

得到想要的结果

于 2013-11-08T18:33:31.607 回答
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 可能不需要在内部调整大小。

于 2013-11-08T19:03:46.747 回答