题目描述
键盘输入任意字符串,打乱里面的内容
训练目标
随机数类Random相关API、字符串相关API
训练提示
1、字符串是不可变的
2、如果要变化需要变成字符数组
3、调整完毕之后再变回字符串
思路
- 将字符串转换为数组形式(因为字符串不可修改)
- 通过用随机数,每次得到一个范围在0~str-1的随机数,然后依次修改字符数组的每个值为str[rand],用一个数组来记录已经出现过的索引值,如果出现过了则再次随机
问题
传入一个长度为5的字符串,但随机数总是只能随到1~3,后来发现记录出现的索引值的数组初始化时,数组元素全部被赋值为0,所以随机不到0
代码
```java
public class test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next();
//1、将输入的字符串转为字符数组
//字符变字符数组有方法直接用
char[] strArr = str.toCharArray();
// for (int i = 0; i < str.length(); i++) {
// strArr[i] = str.charAt(i);
// }
//2、将数组打乱,顺序对数组的各个索引赋予不同的字符索引,但如何确保已经随机过的数字不会重新出现,需要判断一下,再创建一个数组来存储已经出现过的数字;
Random r = new Random();
int[] wasArr = new int[str.length()]; //创建一个长度和字符串索引一样的数组,来存储已经出现的随机数字
//显示数组初始化为了0,所以可以对这个数组先赋值
// for (int i = 0; i < wasArr.length; i++) {
// System.out.print(wasArr[i]);
// }
for (int i = 0; i < wasArr.length; i++) {
wasArr[i] = str.length() + i;
}
int rand = r.nextInt(str.length()); //随机数rand在0~str的长度之间
for (int i = 0; i < strArr.length; i++) {
//先判断一下这次的随机数有没有出现过
while (happen(wasArr, rand)) {
//当进入循环时,说明出现了,则要重新随机一个rand值
rand = r.nextInt(str.length());
}
//当跳出while后,说明这次的rand是未出现的新值,则把它添加到判断数组wasArr中
wasArr[i] = rand;
//System.out.println(wasArr[i]); //显示本次随机的索引值
//然后让字符串数组当前索引的值为这个随机值
strArr[i] = str.charAt(rand);
System.out.print(strArr[i]);
}
}
public static boolean happen(int[] arr , int a){ // 判断a是否在数组arr中出现过
boolean flag = true;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == a)
break; //出现了
else if(i == arr.length - 1 )
flag = false; //未出现
}
return flag;
}
}