2013-12-11 29 views
0
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]);  
    } 
} 

这种方法的目标是交换字符串中的每两个字符,我搜索,我无法理解其他解决方案。这种方法适用于单词喵,但它仍然超出界限。为什么?
如果Google在这里发送了您的请求:我将两个添加到数组的末尾而不是删除两个。简单的错误总是隐藏在我身上。如何阻止这种情况发生,为什么不是我已经在做的工作?

编辑:现在我遇到了不均匀的字符串问题。如果没有匹配,我该如何告诉编译器只保留最后一个字符?

+0

'它仍然超出界限的。为什么?'因为你试图访问索引大于数组长度的元素,这就是为什么。 – Prateek

+0

'我<= oc.length + 2'这总是会引起问题。最大长度是长度,你循环到长度+2。 –

+0

伙计。算一算。 “meow”的长度为4.你的for循环将我从0移动到oc.length + 2,这对于“喵”是6。当然你会走出界限!如果你以“”或奇数开头,你的故事将会非常糟糕。您需要以不同的方式考虑整个解决方案。考虑有多少对可以从那里出来和解决。 –

回答

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。你至少读过这篇文章并且能够精确地将发布的代码缩小到发生错误的位置,但是如果你付出足够多的关注,这个堆栈跟踪通常会告诉你试图访问的索引号,并且它会告诉你数组中最后一个可用索引的编号。

+0

谢谢!但是,我如何让编译器独自留下不均匀的剩余字符? –

+1

如果你的单词是'maths',你将从索引0开始,'m',并交换'0'和'1',给你留下'amths'。然后你将两个添加到'i'并重新执行。你将会在索引2,'t'和swap' 2'和'3',给你留下'amhts'。现在你要添加'2'来索引,并且在索引'4'上。当'i nhgrif

+0

它不打印最后一个s。学习决赛已经毁了我的大脑......我只需要重新定位sys.out.print命令? –

2

for循环超出了字符串的长度(时ioc.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"); 
    } 
} 
+0

什么?我试图用一个字符串来交换字符。 –

+0

它不会抛出超出界限的异常。如果'i = oc.length-2',那么'i + 1'是'oc.length-1',这不是越界。 – MT0

相关问题