我想根据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);
}
}
}
任何帮助将不胜感激。如果这是一个简单的问题,我很抱歉。
答案 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];
}
}