Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将字符串数组转换为列表并删除字符串会出现致命异常_Android_Arrays_Arraylist - Fatal编程技术网

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")) {

在我的Android应用程序中,我有一个字符串数组,我想从中删除字符串

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);