黑马Java课后题之打乱字符串


题目描述

键盘输入任意字符串,打乱里面的内容

    训练目标

    随机数类Random相关API、字符串相关API

    训练提示

    1、字符串是不可变的

    2、如果要变化需要变成字符数组

    3、调整完毕之后再变回字符串

思路


  1. 将字符串转换为数组形式(因为字符串不可修改)
  2. 通过用随机数,每次得到一个范围在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;
    }

}
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值