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)是最后一个字符,它就会失效。