2013-09-24 27 views
3

下面的代碼必須接受一個字符串並切換兩個字符(隨機生成)stringLength()次的位置。字符的隨機排列Java

但是,有時我會輸出兩位數字或兩位數字。 我已經嘗試了各種各樣的事情,從改變我如何獲得隨機到管理子字符串,我仍然得到這些異常。

Scanner in = new Scanner(System.in); 
String word = in.next(); 
for (int wordLength = word.length(); wordLength >= 0; wordLength--){ 
    int i = (int) (Math.random() * (wordLength - 1)); 
    int j = 0; 
    // j has to be bigger than i. 
    while (j < i){ 
     j = (int) ((Math.random() * wordLength)); 
    } 
    String first = word.substring(0, i); 
    String middle = word.substring(i, j); 
    String last = word.substring(j); 
    word = first + word.charAt(j) + middle + word.charAt(i) + last; 
    System.out.println(word); 
} 

問題是來自Java的每個人,但它是特別不是作業。

感謝您的想法

+0

從你寫的問題來看,爲什麼不通過生成兩個隨機索引並交換str.length()次那些索引處的字符來簡化代碼? – hrv

回答

3

substring方法是在下部指數包容。因此,您將兩次交換的字符包括在一起:一次在middlelast的開始處單獨添加和一次。

你必須在他們各自的指數+1開始你middlelast子,以避免包括在這些字符串ij的字符。


你可以明白我說的,如果你把幾print行權之前修改word(看看你想說的話)。您將能夠從這些打印輸出中看到您即將重複某些字符。

System.out.println(String.format("i: %s, j: %s", i, j)); 
System.out.println("first: "+first); 
System.out.println("char i: "+word.charAt(i)); 
System.out.println("middle: "+middle); 
System.out.println("char j: "+word.charAt(j)); 
System.out.println("last: "+last); 

正如托馬斯·W的評論指出的那樣,你也要去當你做出此修復程序,因爲你的循環是包括在兩個底部頂部碰上StringIndexOutOfBoundsError。在完全修復之前,您需要先解決這個問題(在循環的開始或結束時)。

+2

外部'wordLength'循環上還有一個邊界錯誤 - 它包含在頂部和終止邊界上。在最後一次迭代中,'wordLength - 1'將爲-1。不是想要的。 –

+0

是的,將代碼更改爲'String middle = word.substring(i + 1,j); \t \t \t String last = word.substring(j + 1);'確實產生了正確的結果。但是,我開始接收一個字符串索引超出界限錯誤。 – borg123

+0

@ThomasW是的,絕對正確。謝謝你們倆。 – borg123

2

您可以使用Collections.shuffle(List<?> list)進行排列。請參閱文檔here

String str = "abcdefgh"; 
Character[] chArr = ArrayUtils.toObject(str.toCharArray()); 
Collections.shuffle(Arrays.asList(chArr)); 
System.out.println(ArrayUtils.toString(chArr)); 
+0

我想這將使用Apache Commons Lang for ArrayUtils?來自Apache Commons Lang的是 – demongolem

+0

。 – Alex