2

我想根据 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);
            }
        }
    }

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

4

2 回答 2

6

这段代码有很多问题:

  • 最好有一个实例,Random而不是在每次调用时创建一个新实例getNumber()
  • 与其在 中更改实例变量,不如getNumber()只返回该值并将其分配给 中的局部变量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
    
  • 将列表打乱可能是一个更好的主意,从中创建一个Queue,然后您可以在每次需要时从队列中取出一个项目。(当您全部使用它们时,这也很容易发现)

于 2012-05-20T17:44:04.443 回答
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];
   }
}
于 2012-05-20T18:53:24.480 回答