2013-09-24 85 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