Android 将字符串数组转换为列表并删除字符串会出现致命异常
在我的Android应用程序中,我有一个字符串数组,我想从中删除字符串Android 将字符串数组转换为列表并删除字符串会出现致命异常,android,arrays,arraylist,Android,Arrays,Arraylist,在我的Android应用程序中,我有一个字符串数组,我想从中删除字符串 List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory)); for (int i = 0; i < dishCategory.length; i++) { if (dishCategory[i].equals("Beilagen")) {
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()]);
}
这是因为您正在修改迭代的
列表。例如,如果您的列表
有两个项目长,则会出现错误:
["Beilagen", "Beilagen"]
第一次迭代将删除索引0
处的项。这将修改列表
,使其如下所示:
["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()]);
}
List categoryList=newarraylist(Arrays.asList(dishcontegory));
int上限=dishcontegory.length;
for(int i=0;i
但是我建议如果您想要干净的代码,就使用它,因为它是为这种目的而设计的。这是因为您正在修改迭代的列表。例如,如果您的列表
有两个项目长,则会出现错误:
["Beilagen", "Beilagen"]
第一次迭代将删除索引0
处的项。这将修改列表
,使其如下所示:
["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()]);
}
List categoryList=newarraylist(Arrays.asList(dishcontegory));
int上限=dishcontegory.length;
for(int i=0;i
但我建议您使用干净的代码,因为它就是为这种目的而设计的。更改:
for (int i = 0; i < dishCategory.length; i++) {
for(int i=0;i
致:
for(int i=0;i
请记住,所有数组都是0索引的,因此索引永远不会像结构的实际长度那么大。更改:
for (int i = 0; i < dishCategory.length; i++) {
for(int i=0;i
致:
for(int i=0;i
请记住,所有数组都是0索引的,因此您的索引从来没有结构的实际长度那么大。我的建议是使用内置的迭代器
,它是ArrayList
的一部分,可以在数组中进行迭代。下面是一个简单的实现,它可以实现您想要的功能。还可以更改列表
在删除完所有元素后返回数组。这将使运行时O(n)
而不是当前的O(n^2)
我的建议是使用内置的迭代器
,它是ArrayList
的一部分,用于迭代数组。下面是一个简单的实现,可以实现您想要的功能。在删除完所有元素后,还可以将列表
更改回数组。这将使您的运行时O(n)
而不是当前的O(n^2)
List categoryList=newarraylist(Arrays.asList(dishcontegory));
categoryList.removeAll(Arrays.asList(“Beilagen”);
dishcegory=目录列表toArray(dishcegory);
List categoryList=新的ArrayList(Arrays.asList(dishcontegory));
categoryList.removeAll(Arrays.asList(“Beilagen”);
dishcegory=目录列表toArray(dishcegory);
List<String> categoryList = new ArrayList<String>(Arrays.asList(dishCategory));
categoryList.removeAll(Arrays.asList("Beilagen"));
dishCategory = categoryList.toArray(dishCategory);