我有这个 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/