我是Java编程的新手,我正在编写代码用%20
替换字符串中的空格并返回最终的String。这是问题的代码。由于我是编程新手,请告诉我我做错了什么。抱歉我的英语不好。
package Chapter1;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Problem4 {
public char[] replaceSpaces(char[] str_array, int length)
{
int noOfSpaces=0,i,newLength;
for(i=0;i<length;i++)
{
if(str_array[i]==' ')
{
noOfSpaces++;
}
newLength = length + noOfSpaces * 2;
str_array[newLength]='\0';
for(i=0;i<length-1;i++)
{
if(str_array[i]==' ')
{
str_array[newLength-1]='0';
str_array[newLength-2]='2';
str_array[newLength-3]='%';
newLength = newLength-3;
}
str_array[newLength-1]=str_array[i];
newLength = newLength - 1;
}
}
return str_array;
}
public static void main(String args[])throws Exception
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Please enter the string:");
String str = reader.readLine();
char[] str_array = str.toCharArray();
int length = str.length();
Problem4 obj = new Problem4();
char[] result = obj.replaceSpaces(str_array, length);
System.out.println(result);
}
}
但是我收到以下错误:
Please enter the string:
hello world
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
at Chapter1.Problem4.replaceSpaces(Problem4.java:19)
at Chapter1.Problem4.main(Problem4.java:46)
答案 0 :(得分:2)
如何使用String.replaceAll()
:
String str = reader.readLine();
str = str.replaceAll(" ", "02%");
修改强>:
问题出在第19行:
str_array[newLength]='\0';//<-- newLength exceeds the char array size
这里的数组是静态的,即大小是固定的,您可以使用StringBuilder
,StringBuffer
等来构建新的String,而不必担心这些小操作的大小。
答案 1 :(得分:2)
假设您希望了解在实施方法时出现的错误,而不是寻找完全不同的方法:
(1)正如已经指出的,一旦分配了一个数组,它的大小就不能改变。您的方法将str_array
作为参数,但生成的数组可能会大于str_array
。因此,由于str_array
的长度无法更改,因此您需要分配一个新数组来保存结果,而不是使用str_array
。您已正确计算newLength
;分配该大小的新数组:
char[] resultArray = new char[newLength];
(2)正如Elliott指出的那样,Java字符串不需要\0
个终结符。如果出于某种原因,您确实想要创建一个末尾带有\0
字符的数组,那么您必须将1添加到计算出的newLength
以计算额外字符。
(3)您实际上是在向后创建结果数组。我不知道这是否是故意的。
if(str_array[i]==' ')
{
str_array[newLength-1]='0';
str_array[newLength-2]='2';
str_array[newLength-3]='%';
newLength = newLength-3;
}
str_array[newLength-1]=str_array[i];
newLength = newLength - 1;
i
从字符串的第一个字符开始向上;你填写从字符串的最后一个字符(newLength
)开始并向后的字符。如果那是你打算做的,那么你的问题就不清楚了。您希望输出为"dlrow%20olleh"
吗?
(4)如果 想要向后转,那么上面代码对空格的作用是将%20
放入字符串(向后),但是然后它还将空间放入结果。如果输入字符是空格,则要确保不执行将输入字符复制到结果的两行。因此,您需要添加else
。 (请注意,此问题会导致越界错误,因为您尝试将更多字符放入结果中而不是计算出来。)您需要有else
个即使你真的打算构建字符串转发并需要改变逻辑以使其继续前进。
答案 2 :(得分:1)
Java数组不是动态的(它们是Object
实例,并且它们具有不会更改的字段length
属性。因为它们将长度存储为字段,所以知道它们不是'\0'
终止是很重要的(您尝试添加这样的终结符会导致索引超出范围Exception
)。您的方法似乎不访问任何实例字段或方法,因此我将其设置为静态。然后,您可以使用StringBuilder
和for-each
loop。像
public static char[] replaceSpaces(char[] str_array) {
StringBuilder sb = new StringBuilder();
for (char ch : str_array) {
sb.append((ch != ' ') ? ch : "%20");
}
return sb.toString().toCharArray();
}
然后将其称为
char[] result = replaceSpaces(str_array);
最后,您可以按照@Arvind here的建议使用String str = reader.readLine().replace(" ", "+");
或replaceAll(" ", "%20")
。
P.S。当您最终得到result
时,您需要修改对print
的通话。
System.out.println(Arrays.toString(result));
或
System.out.println(new String(result));
char[]
不是String
,Java数组(令人失望)不会覆盖toString()
,因此您将从Object
获取该数据。
答案 3 :(得分:0)
此行str_array[newLength]='\0';
引发了异常,因为newLength
的值大于str_array
的长度。
定义后,无法增加数组大小。所以尝试替代解决方案。
char[] str_array1=Arrays.copyOf(str_array, str_array.length+1);
str_array1[newLength]='\0';
不要忘记导入新包import java.util.Arrays;
答案 4 :(得分:0)
请告诉我我做错了什么
您尝试用三个字符替换单个字符
%20
。这是不可能的,因为数组是固定长度的。
因此,您必须分配一个新的char[]
并将str_array中的字符复制到新数组中。
for (i = 0; i < length; i++) {
if (str_array[i] == ' ') {
noOfSpaces++;
}
}
newLength = length + noOfSpaces * 2;
char[] newArray = new char[newLength];
// copy characters from str_array into newArray