2015-05-07 193 views
1

的最后一个字母我编程脚本用于交换在一个句子中每个字母有带旁边的字母。脚本截断字符串

例如,ABRACADABRA成为BARCADABARA ...但是,有一个问题,当我编译它截断最后一个A,导致BARCADABARA脚本。这导致任何字符串,即使是那些不以A结尾

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone { 

    public static void main (String[] args) throws java.lang.Exception { 

     String word = "ABRACADABRA"; 
     String finalword = ""; 

     for (int i = 0; i < word.length()-1; i++) { 

      String wordsub = word.substring(i, i+1); 
      String wordsub2 = word.substring(i+1, i+2); 

      if(wordsub.equals("A") && !wordsub2.equals("A")){ 
       i++; 
       finalword = finalword + wordsub2; 
       finalword = finalword + wordsub; 
      } else { 
       finalword = finalword + wordsub; 
      } 
     } 

     System.out.println(finalword); 
    } 
} 
+0

顺便说一句,在循环中连接字符串是一个糟糕的主意,它可能会导致严重的性能缺陷,为更多的长字符串。考虑使用'StringBuilder'。 –

+0

这是针对AP计算机科学实践的......你认为'StringBuilder'是集合的一部分吗?我不这么认为,但谢谢。 @TagirValeev – seanlevan

回答

1

问题的根源是,你停止通过在倒数第二个字符的字符串,但在可能的4箱子3迭代只在当前索引处添加字符,忽略最终索引处的字符。

i是在倒数第二个指标:

ABRACADABRA 
     ^

wordsubRwordsub2A,但你打别的,只添加wordsub到最后的字符串,则循环终止,因为i是不再小于长度 - 1

这实际上产生了正确的结果,所述的第二至最后一个字母为“A”和最后一个字母的情况下不是因为在这些条件下,如果该条件为真并且两个字母都被添加到最终的字符串中。

我看到了两个简单的方法来解决这个问题:

  1. 迭代字符串的结尾,并添加更多的逻辑,以防止wordsub2从得到一个StringIndexOutOfBoundsException
  2. 定义wordsub2外循环,并添加一个标志,是设置循环中,表示如果需要将它添加到finalword结束。
0

更新else部分如下

else{ 
    finalword = finalword + wordsub; 
    finalword = finalword + wordsub2; 
} 

的变化会做如下

ABRACADABRA 
A B 
BA 
R A 
A C 
BARACA 
A D 
BARACADA 
A B 
BARACADABA 
R A 
-------------------BARACADABARA 
0

当我读到,“我编程脚本用于交换的每个字母在一个句子A旁边有这封信。“我认为字母“A”可以在信件的左边或右边。

你的if语句if(wordsub.equals("A") && !wordsub2.equals("A"))如果只检查字母“A”在左边,而不是右边。

因此,在第一次迭代中,您将AB交换为BA,然后移至R.R旁边是A(RA),但是A位于右侧,而不是左侧,因此if语句失败。在您的if语句中添加||子句来解释此问题。

public static void main(String[] args) throws Exception { 

    String word = "ABRACADABRA"; 
    String finalword = ""; 

    for (int i = 0; i < word.length()-1; i++) { 

     String wordsub = word.substring(i, i+1); 
     String wordsub2 = word.substring(i+1, i+2); 

     if((wordsub.equals("A") && !wordsub2.equals("A")) || 
      (!wordsub.equals("A") && wordsub2.equals("A"))) { 
      i++; 
      finalword = finalword + wordsub2; 
      finalword = finalword + wordsub; 
     } else { 
      finalword = finalword + wordsub; 
     } 
    } 

    System.out.println(finalword); 
} 

结果:

BAARACADBAR

1

与您的代码的问题是,它不是遍历所有的人物和提前结束1个字符。你可以通过遍历所有字符来解决这个问题,并且在检索下一个字符之前还要检查没有到达字符串末尾的附加检查。所以,你的修改后的代码变成这样

String finalword = ""; 

for (int i = 0; i < word.length(); i++) { 

    String wordsub = word.substring(i, i+1); 

    if((i+1) == word.length()){ 
     finalword = finalword + wordsub; 
     break; 
    } 

    String wordsub2 = word.substring(i+1, i+2); 
    if(wordsub.equals("A") && !wordsub2.equals("A")){ 
     i++; 
     finalword = finalword + wordsub2; 
     finalword = finalword + wordsub; 
    } else { 
     finalword = finalword + wordsub; 
    } 
} 

作为一个副作用,我还发现,有太多的字符串操作都happenning。你应该避免使用太多的String会占用内存。您可以选择下面的代码作为替代。

char wordArr[] = word.toCharArray(); 
StringBuilder finalWord = new StringBuilder(); 
int wordLength = wordArr.length; 

for(int i=0; i < wordLength; i++){ 

    if((wordArr[i]=='A') && (i!=wordLength-1)){ 
     finalWord.append(wordArr[i+1]); 
     finalWord.append(wordArr[i]); 
     i++; 
    }else{ 
     finalWord.append(wordArr[i]); 
    } 

} 
System.out.println(finalWord.toString()); 
+0

谢谢你的回答。构建得非常好! – seanlevan

+0

@seanlevan很高兴我能帮上忙。 – CuriousMind

+0

对不起,如果这听起来无知,但代码的修改部分在哪里解决了我的问题?我只是无法找到它... – seanlevan