【问题标题】:Generating a random number excluding 0 from an ArrayList in java从java中的ArrayList生成一个不包括0的随机数
【发布时间】:2013-10-16 17:14:57
【问题描述】:
static ArrayList<Integer> usedArray = new ArrayList<Integer>();

public static void arrayContents(){

usedArray.add(2, 2);
usedArray.add(1, 1);

}

public static void app(){

    Random generator = new Random ();

    int randomNumber = generator.nextInt(usedArray.size());

    System.out.println(usedArray);

    System.out.println(randomNumber);


    if(randomNumber == 2){
        score();
        question2();
        usedArray.remove(2);
        app();
    }

.add(2, 2)

我收到一个错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 0

但是使用

.add(2)

0 作为数组的一部分生成,即使它不是数组中保存的值。默认情况下,数组是否总是包含 0,有什么办法可以解决这个问题,使 0 不能作为随机数生成?

【问题讨论】:

  • 使用前请阅读该类的javadoc。
  • 你为什么要使用基于索引的添加? .add(index, object) 而不仅仅是 .add(object)
  • ArrayLists0-based 索引(即)起始索引是0,最后一个索引是list.size()-1

标签: java arraylist indexing int


【解决方案1】:

您遇到了这个问题,因为当您创建数组列表时它的大小为零,然后当您调用usedArray.add(2, 2); 时,您正在尝试使用整数 2 更新数组列表中的第二位;但正如我所说,arraylist 目前没有 2 号插槽。除非您有理由使用.add(index, object) 方法,否则只需正常添加它们,如.add(object)

usedArray.add(2, 2); //<-- here you update slot 2, putting Integer 2 in it, there is no slot 2 at this point

如果这只是您可以使用的可用随机数列表;

usedArray.add(1);
usedArray.add(2);

现在数组列表中可以使用数字 1 和 2。

然后可以从数组列表中随机获取这些:

int randomNumber = usedArray.get(generator.nextInt(usedArray.size()));

在本例中,generator.nextInt(usedArray.size() 将生成数字 0 或 1,这将分别从数组列表中获取 1 或 2

【讨论】:

  • 当从arrayList中删除1或2时,由于arrayList中只有1项,是否只会生成0?
  • @leo 数组列表中没有零,除非你在其中放一个
【解决方案2】:

在您的代码中,您已从列表中删除了第二个位置并尝试对其进行更新。这就是您获得 AIOBE 的原因。使用 add() 或尝试增加列表大小。

【讨论】:

    【解决方案3】:

    您遇到的问题是您创建了一个空的List 输入new ArrayList&lt;Integer&gt;()

    你不能使用add(int index, E element),因为它

    在此列表中的指定位置插入指定元素。

    对于长度等于0 的列表会发生异常。

    当你使用add(E e)时。

    将指定元素附加到此列表的末尾。

    正如 Ted Hopp 在评论中指出的那样

    问题是您不能插入到列表的当前末尾之外。

    这意味着您可以使用add(int index, E element),前提是索引比大小更重要。

    另外当你打电话时

    int random = new Random().nextInt(list.size());

    那么结果在 0(包括)和list.size()(不包括)之间。这意味着您将始终得到一些有效的索引,并且您不必担心顺序。

    【讨论】:

    • 所以 0 是包容性的,因为它总是有机会生成?
    • 列表容量与 OP 异常的原因无关。问题是您不能插入到列表的当前末尾之外。
    • @TedHopp,谢谢你的课程。
    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2018-06-06
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多