0

我有一个对象列表,每个对象都有一些“qid”。qid是整数。列表的“qid”从任何不说的“min”开始,到任何不说的“max”结束。请注意,列表中对象的“qid”不是连续的。意味着例如:min = 6 和 max = 31 但其中只有 16 个对象,它们的 qid 在[min,max](min 和 max 都包括)因此没有任何对象存在,没有 (31-6+1)-16 = 10 qids。意思是这十个qid,没有任何对象存在。然而,只有 16 个对象具有有效的 qid。

现在我有一个大小为 10 的 int 数组,我想在其中随机存储 10 个对象,但它们的 qid 有效。表示这十个对象必须来自这 16 个而不是来自这 26 个。

我正在做以下事情

for (int j = 0; j < 10; j++) {
    checkList[j] = min + (int) (Math.random() * ((max - min) + 1));
    if (qidList.get(checkList[j]) == null ) {
        j--;
        continue;
    } else {
        finalList.add(j,qidList.get(checkList[j])); 
    }
}
  1. qidList = 原始列表,包含 16 个有效对象和有效 qid 的 26 个对象,最大值 = 31,最小值 = 6。
  2. finalList = 将存储随机选择的 10 个对象(26 个中的 16 个不是)的最终列表。
  3. checkList = 大小为 10 的整数数组,其中仅存储随机选择的 10 个 finalList 对象的 qid(而不是其他属性)。

我越来越indexoutofboundsexception。有人能帮我吗?

4

2 回答 2

0

From your comment (now apparently deleted), it appears like the problem is with qidList.get, as if the problem was with checkList[j], it would have thrown an exception on the line before. Thus, check that max is less than the size of qidList. If not, you can get the following IndexOutOfBoundsException on the get method. From the List API:

IndexOutOfBoundsException - if the index is out of range (index < 0 || index >= size())

Update: To guard against this, change it to the following:

if ((checkList[j] >= qidList.size()) || (qidList.get(checkList[j]) == null)) {
    j--;
    continue;
}

Or better yet, set max to qidList.size() - 1 before you enter the loop

于 2012-07-17T15:21:04.820 回答
0

由于您在 for 循环内递减 j,您可能会超过 0(即 -1 及以上),这会引发 indexOutOfBounds

编辑:

基于错误发生在“qidList.get(checkList[j]) == null”行的注释,那么显然qidList没有checkList[j],这意味着上面的行“checkList[j] = min + (int ) (Math.random() * ((max - min) + 1));" 被设置为 qidList 大小之外的值!

打印出 checkList[j] 的值来调试!

于 2012-07-17T15:06:55.090 回答