我知道我得到一个stackoverflow因为我正在使用递归但是有一个简单的方法来绕过这个吗?

时间:2012-05-20 17:40:07

标签: java android stack-overflow

我想根据0到10之间的数字将图像添加到ImageButton。我的getNumber方法是:

    public int getNumber(){
    // get a random number between 0 and 10
    Random randomNumber = new Random();
    num = randomNumber.nextInt(10);
    return num;
}

我希望每个图像都是唯一的,但我遇到的问题是,如果numList确实包含num,那么只需将按钮留空即可。我试图再次递归调用permuteButton,直到我的列表中没有包含num,但这似乎不起作用。

    public void  permuteButton(ImageButton btn){    

        getNumber();

        for(int i=0; i<=numList.size(); i++){
            //check if the number is already being used
            if( numList.contains(num) ){
                permuteButton(btn);
            }
            // else the list doesnt have the number so assign the picture and add number to list
            else{
                numList.add(num);
                assignPictures(btn);
            }
        }
    }

任何帮助将不胜感激。如果这是一个简单的问题,我很抱歉。

2 个答案:

答案 0 :(得分:6)

此代码存在各种问题:

  • 最好是拥有Random的单个实例,而不是在每次调用getNumber()时创建新实例
  • 而不是更改getNumber()中的实例变量,只返回值并将其分配给{{1}中的 local 变量是明智的。 }}
  • 可以 使用permuteButton中的while循环代替递归:

    permuteButton
  • 最好只是将列表重新打开,从中创建一个int num = getNumber(); while (numList.contains(num)) { num = getNumber(); } numList.add(num); assignPictures(btn); // Presumably you'd now want to pass in num too ,然后每次需要时都可以从队列中取出一个项目。 (当你全部使用它们时,这也很容易发现)

答案 1 :(得分:2)

我的回答类似于Jon Skeet的最后一条建议。

// might be more than 10 ImageButtons, with only 10 images
for (ImageButton imageButton : imageButtons)  
   imageButton.putImage(randomImage.next());

...

public class RandomImage {
   private final List<Image> shuffledImages;
   private int currentIndex;

   public RandomImage(List<Image> images) {
      shuffledImages = new ArrayList<>(images.size());
      shuffledImages.addAll(images);
      currentIndex = -1;
   }

   public Image next() {
      currentIndex++;
      if (currentIndex % shuffledImages.size() == 0) {
         currentIndex = 0;
         Collections.shuffle(shuffledImages);
      }
      return shuffledImages[currentIndex];
   }
}