Android:错误java.lang.IndexOutOfBoundsException无效的位置

时间:2011-05-06 08:27:55

标签: java android

我在下面有这个方法,根据我的JSON条目的大小生成随机数,每个数字只能来一次。我将方法强制转换3次,因为我需要生成3个随机数,它们之间应该是不同的。

有时候它有效,但有时它会在logcat上给我这个错误:错误java.lang.IndexOutOfBoundsException无效位置 这让我的应用程序崩溃了。

有人可以帮我解决问题吗? THX!

          int max = prjcts.size();
          List<Integer> indices = new ArrayList<Integer>(max);
          for(int c = 1; c < max; ++c)
          {
              indices.add(c);
          }

          int arrIndex = (int)((double)indices.size() * Math.random());
          int randomIndex1 = indices.get(arrIndex);
          indices.remove(arrIndex);


          int randomIndex2 = indices.get(arrIndex);
          indices.remove(arrIndex);


          int randomIndex3 = indices.get(arrIndex);
          indices.remove(arrIndex);

@KPBird: 所以我改变我的代码就像你告诉我的那样,但它仍然给我错误soemtime: 我错过了什么吗?

Random r = new Random();
  int arrIndex = r.nextInt(indices.size());
  int randomIndex1 = indices.get(arrIndex);
  indices.remove(arrIndex);


  int randomIndex2 = indices.get(arrIndex);
  indices.remove(arrIndex);


  int randomIndex3 = indices.get(arrIndex);
  indices.remove(arrIndex);

2 个答案:

答案 0 :(得分:5)

问题是indices.remove(...)从列表中删除条目,并在每次调用时将列表的大小减小1。另一个问题似乎是你试图为每个randomIndexX获得相同的数组索引,这实际上没有任何意义。

修改:根据我的评论完成示例。这会以随机顺序打印出数字1到N(包括)。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class RandomX {  

  public static void main(String[] args) {
    int start = 1;
    int n = 10;
    List<Integer> numbers = new ArrayList<Integer>();

    for (int i = start; i <= n; i++) {
      numbers.add(i);
    }

    Collections.shuffle(numbers);

    for (int i = 0; i < n; i++) {
      System.out.println(numbers.get(i));
    }
  }

}

答案 1 :(得分:3)

indices.size() * Math.random()可能会返回列表的大小。这比最后一个索引多一个。

因此,您应该使用indices.size() - 1作为最大值。