2016-10-03 64 views
0

我想混合使用字符串緩衝區的字符串。程序應該隨機選擇StringBuffer1(sb1)中的單詞內的一個字符。將它附加到空的StringBuffer2(sb2),並持續執行此操作,直到StringBuffer1(sb1)的sb1.length()等於0(空)。字符串索引超出範圍錯誤:如何解決?

這裏是我的代碼:

String word = "Hello"; 
String empty = ""; 
StringBuffer sb1 = new StringBuffer(word); 
StringBuffer sb2 = new StringBuffer(empty); 
Random randomChar = new Random(); 

while (word.length() != 0) { 
    int charIndex = randomChar.nextInt(word.length()); 
    char character = sb1.charAt(charIndex); 
    sb2.append(character); 
    sb1.deleteCharAt(charIndex); 
} 

System.out.println(word.length()); 
System.out.println(word); 
System.out.println(sb2); 
+5

再次仔細閱讀您的代碼。你在循環'word.length()',但是你從'sb1'中刪除。這將是學習使用調試器的好時機,它可以讓你在比你發佈在這裏的時間更少的時間內自己弄清楚。 –

+1

爲什麼不轉換爲字符數組,然後洗牌,並轉換回字符串? –

回答

-1

試試這個。由於Random,這可能會有比預期更多的時間循環。

說明:問題與索引。當你從字長中選擇隨機數時,你將得到0-> length-1的元素,但同時你也從字符串緩衝區中刪除元素,所以下一次當你得到index = length-1時,它不會是存在於字符串緩衝區中,這就是爲什麼你會遇到錯誤。當字符串緩衝區長度變爲零時,我也添加了終止條件。

  String word = "Hello"; 
      String empty = ""; 
      StringBuffer sb1 = new StringBuffer(word); 
      StringBuffer sb2 = new StringBuffer(empty); 
      Random randomChar = new Random(); 

      while (word.length() != 0 && sb1.length() != 0) { 
       int charIndex = randomChar.nextInt(word.length()); 
       if (sb1.length() > charIndex) { 
        char character = sb1.charAt(charIndex); 
        sb2.append(character); 
        sb1.deleteCharAt(charIndex); 
       } 
      } 

      System.out.println(word.length()); 
      System.out.println(word); 
      System.out.println(sb2); 
+0

僅僅提供替換代碼而不解釋你所修復的是一個不好的答案。 – John3136

+0

@ John3136感謝您的通知。我也添加了解釋。我在看完代碼後想,記者將能夠確定是什麼問題,因爲變化不大。 – cody123

+0

@ cody123發表其他人對其他人的評論答案..不是一個好的做法。無論如何..修改了你指出的解釋。 –

0

您在StringBuffer sb1進行更改,而您要驗證反對String word長度的循環。所以。

  1. 你正在創建一個無限循環,並
  2. Random數是基於word.length()產生的,這將是5始終。

使用sb1.length()代替word.length()這樣的sb1該長度用於循環以及隨機數。

+0

僅僅提供替換代碼而未解釋你所修復的是一個不好的答案。 – cody123

+0

雖然我的答案足以理解這個問題,但編輯答案的解釋 –