3

下面的代码必须接受一个字符串并切换两个字符的位置(随机生成) stringLength() 次。

但是,有时我会在输出中多获得两位数,或者少两位数。我已经尝试了各种各样的事情,从改变我获取随机数的方式到管理子字符串,我仍然得到这些异常。

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 for Everyone,但它特别不是家庭作业。

谢谢你的想法

4

2 回答 2

3

substring方法在较低的索引上具有包容性。结果,您包含了两次交换的字符:一次是单独添加它们,一次是在middleand的开头last

您需要在它们各自的索引处开始您的middle和子字符串,以避免在这些字符串中包含字符。last+1ij


如果您在修改之前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);

正如 Thomas W 在评论中指出的那样,您在进行StringIndexOutOfBoundsError此修复时也会遇到 a,因为您的循环在顶部和底部都包含在内。您需要以一种或另一种方式解决此问题(在循环的开头或结尾),然后才能完全修复它。

于 2013-09-24T23:57:27.703 回答
2

您可以Collections.shuffle(List<?> list)用于排列。请参阅此处的文档。

String str = "abcdefgh";
Character[] chArr = ArrayUtils.toObject(str.toCharArray());
Collections.shuffle(Arrays.asList(chArr));
System.out.println(ArrayUtils.toString(chArr));
于 2013-09-25T00:04:29.857 回答