Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
Java 递归调用的IndexOutOfBoundsException_Java_Recursion - Fatal编程技术网

Java 递归调用的IndexOutOfBoundsException

Java 递归调用的IndexOutOfBoundsException,java,recursion,Java,Recursion,这是我的代码,应该删除连续的重复项 包装实践。实践 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class RemoveConsecutiveDuplicates { private static int i=1; public static List<String> detectDuplica

这是我的代码,应该删除连续的重复项

包装实践。实践

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class RemoveConsecutiveDuplicates {
    private static int i=1;
    public static List<String> detectDuplicates(List<String> chars) {
        if(i>chars.size())
            return chars;
        while(chars.get(i-1).equals(chars.get(i))) {
            chars.remove(i);
        }
        i++;
        return detectDuplicates(chars);


    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        List<String> chars = new ArrayList<String>(Arrays.asList(str.split("")));
        System.out.println(detectDuplicates(chars));

    }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.Scanner;
公共类RemoveConsecutiveDuplicates{
私有静态int i=1;
检测到的公共静态列表副本(列表字符){
如果(i>chars.size())
返回字符;
while(chars.get(i-1).等于(chars.get(i))){
chars.移除(i);
}
i++;
返回检测副本(字符);
}
公共静态void main(字符串[]args){
扫描仪=新的扫描仪(System.in);
String str=scanner.nextLine();
List chars=newarraylist(Arrays.asList(str.split(“”));
System.out.println(检测到的副本(字符));
}
}
它为输入“asssddaaffgf”引发异常

以下是引发的异常: asssddaaffgff

线程“main”中的异常java.lang.IndexOutOfBoundsException: 索引:7,大小:7 rangeCheck(ArrayList.java:653)位于 get(ArrayList.java:429)位于 Practice.Practice.removeConSecuritiveDuplicates.detectedDuplicates(removeConSecuritiveDuplicates.java:13) 在 Practice.Practice.removeConSecuritiveDuplicates.detectDuplicates(removeConSecuritiveDuplicates.java:17) 在 Practice.Practice.removeConSecuritiveDuplicates.detectDuplicates(removeConSecuritiveDuplicates.java:17) 在 Practice.Practice.removeConSecuritiveDuplicates.detectDuplicates(removeConSecuritiveDuplicates.java:17) 在 Practice.Practice.removeConSecuritiveDuplicates.detectDuplicates(removeConSecuritiveDuplicates.java:17) 在 Practice.Practice.removeConSecuritiveDuplicates.detectDuplicates(removeConSecuritiveDuplicates.java:17) 在 Practice.Practice.removeConSecuritiveDuplicates.detectDuplicates(removeConSecuritiveDuplicates.java:17) 在 Practice.Practice.removeConSecuritiveDuplicates.main(removeConSecuritiveDuplicates.java:26)


您需要在
while
循环中执行检查,因为在删除chars.size()时,chars.size()会发生变化。你可以自己做,自己做

...
while((i<chars.size()) && (chars.get(i-1).equals(chars.get(i)))) {
    chars.remove(i);
}
i++;
return detectDuplicates(chars);
...
。。。

while((i问题在
while
循环中:

while(chars.get(i-1).equals(chars.get(i)))
这里您正在删除元素。因此
List
的大小以及
chars.size()
方法返回的值将发生变化

更改
循环如下:

public static List<String> detectDuplicates(List<String> chars) {
    while(i<chars.size() && chars.get(i-1).equals(chars.get(i))) {
        chars.remove(i);
    }
    i++;

    if(i>chars.size())  return chars;
    return detectDuplicates(chars);
}
检测到的公共静态列表副本(列表字符){
while(ichars.size())返回字符;
返回检测副本(字符);
}

如果(i>=chars.size())
-简单的改变?你的意思是
i
。真的如果
i
大于等于
chars.size
那么
chars.get(i)
会做什么?修复错误的检查。但是主要的想法是
chars.get(i)
如果'chars.remove(i)是最后一个字符,它就会失效。