我有这个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
中存储的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)
感谢您提供的任何帮助。
答案 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来做这种事情,特别是如果数据很大,就像你正在为教科书生成索引一样。