ArrayList添加方法抛出IndexOutOfBoundsException

时间:2013-12-11 23:38:12

标签: 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();
    }
}

其中:

  • textPositionsArrayList<Integer>
  • textParsedArrayList<String>

它旨在更改textPositions,以便String中存储的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 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)

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

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

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循环是一个无限循环,因为如果一个String包含一个子字符串,它将始终继续包含它,除非它变成一个不同的字符串。 :)

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来做这种事情,特别是如果数据很大,就像你正在为教科书生成索引一样。