下面的代码必须取一个字符串并切换两个字符的位置(随机生成)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,但它特别不是家庭作业。
感谢您的想法
substring
方法包含在较低的索引上。因此,您将包含两次交换的字符:一次是在单独添加它们时,一次是在 middle
和 last
的开头。
你需要从middle
开始,last
子字符串在它们各自的索引+1
,以避免在这些字符串中包含i
和j
的字符。
如果你在修改word
之前放几行print
,你可以看到我在说什么(看看你要做什么)。您将能够从这些打印输出中看到您将要重复一些字符。
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
,因为您的循环在顶部和底部都是包含的。在完全修复之前,您需要以一种或另一种方式解决此问题(在循环的开始或结束时)。
Collections.shuffle(List<?> list)
进行排列。请参阅此处的文档。
String str = "abcdefgh";
Character[] chArr = ArrayUtils.toObject(str.toCharArray());
Collections.shuffle(Arrays.asList(chArr));
System.out.println(ArrayUtils.toString(chArr));