Java if语句中的条件始终为true

Java if语句中的条件始终为true,java,android,Java,Android,我不熟悉这种语言,当我工作时,我无法理解为什么条件总是错误的,if语句似乎不起作用。我试图在android studio中生成随机图像,但不重复 private int getRandomImage() { int count = 0; int select; Random r = new Random(); List<Integer> numbers = new ArrayList<>(); while (count &

我不熟悉这种语言,当我工作时,我无法理解为什么条件总是错误的,if语句似乎不起作用。我试图在android studio中生成随机图像,但不重复

  private int getRandomImage() 
  {
    int count = 0;
    int select;
    Random r = new Random();
    List<Integer> numbers = new ArrayList<>();
    while (count < mImageIds.length) {
        select = r.nextInt(mImageIds.length);
        if (!numbers.contains(select)) {
            numbers.add(select);
            count++;
            return mImageIds[select];
        }
    }
    return 0;
  }

我用^^^^^标记对代码中的关键部分进行了注释,以演示事物的流程:

List<Integer> numbers = new ArrayList<>();
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> numbers is empty

while (count < mImageIds.length) {
    select = r.nextInt(mImageIds.length);
    if (!numbers.contains(select)) {
        ^^^^^^^^^^^^^^^^^ numbers is empty -> does not contain select -> true

        numbers.add(select);
        count++;
        return mImageIds[select];
        ^^^^^^ -> leaving the function, the if-statement above will not be reached again

    }
}
return 0;

我用^^^^^标记对代码中的关键部分进行了注释,以演示事物的流程:

List<Integer> numbers = new ArrayList<>();
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> numbers is empty

while (count < mImageIds.length) {
    select = r.nextInt(mImageIds.length);
    if (!numbers.contains(select)) {
        ^^^^^^^^^^^^^^^^^ numbers is empty -> does not contain select -> true

        numbers.add(select);
        count++;
        return mImageIds[select];
        ^^^^^^ -> leaving the function, the if-statement above will not be reached again

    }
}
return 0;

这个解决方案应该能解决你的问题

首先,您需要在方法范围之外定义一些字段

  Random r = new Random();
  List<Integer> numbers = new ArrayList<>();
  int count = 0;

  private int getRandomImage() {
      int select;
      if (count < mImageIds.length) {
          select = r.nextInt(mImageIds.length);
          while(numbers.contains(select)) {
              select = r.nextInt(mImageIds.length);
          }
          numbers.add(select);
          count++;
          return mImageIds[select];
      }
      return -1;
  }
现在,当您将整数添加到数字时,它们不会被擦除,因为您每次调用该方法时都要重新实例化数字。此外,在类似的庄园中,您使用的图片数量也不会重置

您需要使用while循环来确保具有唯一的值


我还将该方法的转义值从0更改为-1,以便在您已经使用了所有图片的情况下,不会意外返回第一张索引图片。

此解决方案应该可以解决您的问题

首先,您需要在方法范围之外定义一些字段

  Random r = new Random();
  List<Integer> numbers = new ArrayList<>();
  int count = 0;

  private int getRandomImage() {
      int select;
      if (count < mImageIds.length) {
          select = r.nextInt(mImageIds.length);
          while(numbers.contains(select)) {
              select = r.nextInt(mImageIds.length);
          }
          numbers.add(select);
          count++;
          return mImageIds[select];
      }
      return -1;
  }
现在,当您将整数添加到数字时,它们不会被擦除,因为您每次调用该方法时都要重新实例化数字。此外,在类似的庄园中,您使用的图片数量也不会重置

您需要使用while循环来确保具有唯一的值


我还将该方法的转义值从0更改为-1,这样在您已经使用了所有图片的情况下,您就不会意外返回第一张索引图片。

可能是因为数字为空;返回mImageIds[选择];会不会因为数字是空的而打破循环;返回mImageIds[选择];谢谢你这么好的解释谢谢你这么好的解释