在我的Android Applicatio中,我有一个字符串数组,我想从中删除字符串。
List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
for (int i = 0; i < dishCategory.length; i++) {
if (dishCategory[i].equals("Beilagen")) {
categoryList.remove(i);
}
String[] dishCategory = categoryList.toArray(new String[categoryList.size()]);
}
但是当我尝试它时,它会给予:
FATAL EXCEPTION: main
Process: de.hswt.fuca, PID: 19818
java.lang.IndexOutOfBoundsException: Invalid index 14, size is 13
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.remove(ArrayList.java:403)
答案 0 :(得分:3)
这是因为您正在修改迭代的List
。如果您的List
长达2个项目,那么出现问题的一个例子是:
["Beilagen", "Beilagen"]
第一次迭代删除索引0
处的项目。这会修改List
,使其看起来像这样:
["Beilagen"]
然后第二次迭代想要删除索引1
处的项目,但列表的长度为1
,这样就会产生IndexOutOfBoundsException
,就像你看到的那样。
对此进行快速而肮脏的修复可能是为了使您想要在删除期间修改的变量迭代的项目数量如此:
List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
int upperLimit = dishCategory.length;
for (int i = 0; i < upperLimit; i++) {
if (dishCategory[i].equals("Beilagen")) {
categoryList.remove(i);
upperLimit--;
i--;
}
String[] dishCategory = categoryList.toArray(new String[categoryList.size()]);
}
但如果您想要干净的代码,我建议您使用listIterator()
,因为它是为了这种目的而制作的。
答案 1 :(得分:0)
我的建议是使用属于Iterator
的内置ArrayList
来遍历数组。这是一个简单的实现,可以满足您的需求。完成删除所有元素后,还要将List
更改回数组。这将使您的运行时O(n)
而不是当前的O(n^2)
List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
Iterator<String> i = categoryList.iterator();
while (i.hasNext()) {
String s = i.next();
if (s.equals("Beilagen")) {
i.remove();
}
}
String [] dishCategory = categoryList.fromArray(String[categoryList.size()]);
如果您Iterators
未将for loop
的限制更改为List.size()
,那么您的for loop
的粉丝也会有效,因为每次通过{i--
都会对其进行重新评估但是,由于在删除后重新评估索引,因此需要List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
for (int i = 0; i < categoryList.size(); i++) {
if (categoryList.get(i).equals("Beilagen")) {
categoryList.remove(i);
i--;
}
}
String [] dishCategory = categoryList.fromArray(String[categoryList.size()]);
。这是代码:
For Each Cell In Range("A19:A" & lastRow)
If Mid(Cell, 5, 1) <> "*" Then Cell.EntireRow.Delete
答案 2 :(得分:0)
LOVE_LOB
答案 3 :(得分:-1)
变化:
for (int i = 0; i < dishCategory.length; i++) {
为:
for (int i = 0; i < dishCategory.length - 1; i++) {
请记住,所有数组都是0索引的,因此您的索引永远不会与结构的实际长度一样大。