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が含まれていると、ボタンが空白のままになることでした。numがリストに含まれなくなるまで、permuteButtonを再帰的に再度呼び出そうとしましたが、これは機能しないようです。

    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
  • 再帰の代わりに、次のループを使用できます。whilepermuteButton

    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 に答える