我正在尝试创建一个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)
告诉我我的错误...提前致谢
答案 0 :(得分:2)
你在做什么
private String inputStr = " ";
private char[] catchStr = new char[inputStr.length()];
inputStr.length()
返回1
,即字符串中的大小&#34; &#34;,所以,你有一个 char数组,大小为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
,,这不是有效索引。尝试从counter
运行1
以避免此错误。
使用固定大小(例如200)声明您的数组或使用ArrayList
。您也可以在输入字符串后输入catchStr = new char[inputStr.length()]
。
答案 1 :(得分:0)
您正在使用inputStr.length()初始化catchStr。但此时inputStr =&#34; &#34 ;.因此,catchStr的长度为1.当您稍后将inputStr填充到更大的值时,您尝试将其复制到长度为1的char []中,并且它不适合。在复制之前添加catchStr = new char[inputStr.length()];
。
答案 2 :(得分: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];
}
}