string o = "meow"
public static void swapPairs(String o){
char x;
char y;
char[] oc = o.toCharArray();
//Array goes out of bounds, but it still works.
for(int i = 0; i<= oc.length+2;i=i+2){
x=oc[i];
oc[i]=oc[i+1];
oc[i+1]=x;
System.out.println(oc[i]+"\n"+oc[i+1]);
}
}
这种方法的目标是交换字符串中的每两个字符,我搜索了一下,我无法理解其他解决方案。这个方法适用于单词meow,但它仍然超出界限。为什么呢?
如果谷歌发送给您:我在阵列的末尾添加了两个而不是删除两个。简单的错误总是偷偷摸摸我。
编辑:现在我遇到了不均匀字符串的问题。如果没有匹配,如何告诉编译器留下最后一个字符?
答案 0 :(得分:4)
oc.length
将返回oc
数组的长度。
数组是0索引的,这意味着数组中的最后一个元素将是oc.length-1
。
i<=oc.length+2
表示您的循环将继续,直到i
超过最后一个索引3。但是,在循环中,你试图访问索引i+1
,如果程序允许你,它将一直到最后一个索引之后的 FOURTH 索引。
鉴于您尝试访问oc[i+1]
,您需要将for
循环更改为更像这样:
for(int i=0; i<oc.length-1; i=i+2)
请注意,这是<
,而不是<=
。
要打印它,如果你想要一行,你可以在循环后执行此操作:
System.out.println(new String(oc));
另一个注意事项,可能有助于您在发布到StackOverflow之前更完整地理解问题,如果您在Eclipse中编写(可能还有一些其他程序),堆栈跟踪会告诉您的不仅仅是OBE。你至少可以阅读它并将发布的代码缩小到发生错误的位置,这很棒,但如果你足够关注,那堆栈跟踪通常会告诉你试图访问的索引的数量,以及它会告诉你数组中最后一个可用索引的编号。
答案 1 :(得分:2)
for
循环超出字符串的长度(当i
为oc.length
或更高时)并且您获得ArrayIndexOutOfBounds
异常;要解决此问题,您需要限制i
,使其始终小于oc.length-1
(因为您需要每个字符和连续的字符进行交换)。
您可以这样做:
public class Test
{
public static void swapPairs(final String o){
char x;
char[] oc = o.toCharArray();
//Array goes out of bounds, but it still works.
for(int i = 0; i<oc.length-1;i=i+2){
x=oc[i];
oc[i]=oc[i+1];
oc[i+1]=x;
}
System.out.println(oc);
}
public static void main(final String[] args)
{
swapPairs( "meow" );
swapPairs( "meowe" );
}
}