java - ArrayList 添加方法抛出 IndexOutOfBoundsException

标签 java collections arraylist

我有这个 for 循环:

for (int i = 0; i < textParsed.size(); ++i) {
    String element = textParsed.get(i); 
    int readString = 0;

    while (savedInput.contains(element)) {
        textPositions.add(savedInput.indexOf(element, readString), i);
        readString += savedInput.indexOf(element) + element.length();
    }
}

地点:

  • textPositions是一个 ArrayList<Integer>
  • textParsed是一个 ArrayList<String>

旨在改变textPositions这样 String s 存储在 textParsed 中在 ArrayList 中表示为数字。

一个例子,textParsed :

["hello", "hi-"]

String :

"hello everyone, hi-hello, it's great to be here, hi-"

应该导致 textPositions类似的东西:

[0, ... , 1, 0, ... , 1]

希望这是有道理的。

当我尝试使用 .add() 时遇到 IndexOutOfBoundsException方法。据我所知,这应该是不可能的。这是异常(exception)情况:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 29, Size: 1
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:612)
at java.util.ArrayList.add(ArrayList.java:426)

感谢您提供的任何帮助。

最佳答案

你的主要问题是 ArrayList 只有在元素已经在内部数组的边界内时才会自动调整大小。如果数组只包含一个元素,则只能ArrayList#add(int, E)在元素 0 处。但是如果已知最大大小,则可以基于该大小创建列表。

ArrayList<Integer> textPositions = new ArrayList<Integer>(savedInput.length());

for (int i = 0; i < savedInput.length(); i++)
    textPositions.add(null);

记住,ArrayList 是一个List 抽象,所以这个想法不是“稀疏的”。它基本上不是为此而设计的,它旨在从头到尾跨越并且是可附加的。 ArrayList 的大小和索引基于它被添加到的次数而不是其内部数组的长度。另请注意,如果预期最终长度,则最好使用初始大小创建列表,这样它就不必自行调整大小。 (或者只使用一个数组!)

此外,您还有其他一些问题。第一个是 add 插入一个元素,移动所有其他元素以腾出空间。我不认为那是你想要的。我想你想使用 set。另一个是你的 while 循环是一个无限循环,因为如果一个字符串包含一次子字符串,它将一直包含它,除非它变成另一个字符串。 :)

int[] textPositions = new int[savedInput.length()];

for (int i = 0; i < textParsed.size(); ++i) {
    String element = textParsed.get(i); 
    int readString = 0;

    int indexOfElement;

    while ((indexOfElement = savedInput.indexOf(element, readString)) > -1) {
        textPositions[indexOfElement] = i;
        readString = indexOfElement + element.length();
    }
}

您还应该考虑对这类事情使用 Map,尤其是在数据很大的情况下,例如您正在为教科书生成索引。

关于java - ArrayList 添加方法抛出 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20532216/

相关文章:

php - 手动将项目添加到现有对象 [Laravel 5]

java - 如何在List <T> JAVA 8中删除重复项

java - 获取现有的 ArrayList 并通过 getter 向其添加值

java - 如何获取新的ArrayList数据?

java - 运行在 Jenkins 下运行 JVM 的批处理文件时的堆大小

java - 如何将类的集合添加到具有集合的类中

java - 使用一个类来测试另一个类?

java - ArrayList作为函数的参数,却未能传递出去?

java - 如何根据其中一个元素对 Object[] 数组进行排序?

java - Spring Reactor : How to zip two Flux, 但有顺序?