2015-05-07 190 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