2017-02-22 87 views
1

我想制作一个java程序,它将查找并删除字符串中的重复字符。就像用户输入“baloon”一样,输出应该是“balon”。我使用String变量进行输入,并将其内容复制到Char数组中,以便我可以分析每个字符。我得到ArrayIndexOutOfBoundsException。这里是我的代码如何解决此运行时错误?

class doubleKiller{ 

private String inputStr = " "; 
private char[] catchStr = new char[inputStr.length()]; 
private String modifiedStr; 

//Accessor method 
public void getString(String inputStr) 
{ 
    this.inputStr = inputStr; 
} 

public String killRepeater() 
{ 

    //copying string data to char array 
    this.inputStr.getChars(0 , this.inputStr.length() , catchStr , 0); 

    //------------------ 

    for(int counter = 0 ; counter < this.inputStr.length() ; counter++) 
    { 
     if(catchStr[counter] != catchStr[counter - 1]) 
     { 
      modifiedStr = modifiedStr + catchStr[counter]; 
     } 
    } 

    return modifiedStr; 
} 

}

这里是输出时killRepeater()被调用。

java.lang.ArrayIndexOutOfBoundsException: src.length=5 srcPos=0 dst.length=1 dstPos=0 length=4 

at java.lang.System.arraycopy(Native Method) 
at java.lang.String.getChars(String.java:894) 
at doubleKiller.killRepeater(Main.java:23) 
    at useThings.main(Main.java:49) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.aide.ui.build.java.RunJavaActivity$1.run(SourceFile:108) 
at java.lang.Thread.run(Thread.java:862) 

告诉我,我的错误...提前

+4

在循环的第一次迭代中,counter是零,所以'catchStr [counter-1]'试图获取索引为'-1'的元素。 –

+0

除了Joe Clay所说的之外,你可能需要修改你的条件以说明你的循环何时开始,这样你就不会出界。 – Chad

回答

2

谢谢,你是做

private String inputStr = " "; 
private char[] catchStr = new char[inputStr.length()]; 

inputStr.length()回报1,即从字符串 “” 大小,因此,你有一个字符数组,大小为1

当你这样做:

for(int counter = 0 ; counter < this.inputStr.length() ; counter++){ 
    if(catchStr[counter] != catchStr[counter - 1]){ 

随着inputStr.length() > 1你有一个ArrayIndexOutOfBoundsException

此外,运行catchStr[counter - 1])首次时候,counter-1会产生-1这不是一个有效的索引。尝试从1运行counter以避免此错误。

固定大小(例如200)或使用ArrayList声明您的阵列。在输入字符串之后,您还可以输入

0

您正在使用inputStr.length()初始化catchStr。但在这个时候inputStr =“”。所以catchStr的长度为1.当你稍后将inputStr填充到一个更大的值时,你尝试将它复制到长度为1的char []中,并且它不适合。在复制之前添加catchStr = new char[inputStr.length()];

1

,你问的具体问题,但如果你有兴趣如何使这个简单的好东西,有正则表达式魔术

String in = "ballooooon"; 
String out = in.replaceAll("(.)\\1+", "$1"); // balon 

这意味着

发现任何符号,将其保存到组1,如果下一个符号或符号等于组1,则删除它们,并从组中只留下一个符号。

0

当你初始化catchStr它总会有1的值,因为inputStr" ",因此它的长度是1

private String inputStr = " "; 
private char[] catchStr = new char[inputStr.length()]; 

当环路上counter的方法killRepeater()你会得到一个ArrayOutOfBoundsException,因为您在getString中传递的字符串可能大于1。


考虑将new char[inputStr.length()]getString

public void getString(String inputStr) { 
    this.inputStr = inputStr; 
    this.catchStr = new char[inputStr.length()]; 
} 

而且,将属性catchStr设置为未初始化。

private char[] catchStr; 

第二个问题是你for循环。您从0开始counter并使用catchStr[counter - 1]回顾前一个字符。这在counter = 0因为索引将评估为-1而不起作用。

考虑从1开始你的counter,并继续从那里开始工作。你需要稍微调整一下,以便输出所需的字符串。

for (int counter = 1; counter < this.inputStr.length(); counter++) { 
    if (catchStr[counter] != catchStr[counter - 1]) { 
     modifiedStr = modifiedStr + catchStr[counter]; 
    } 
}