java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】

这篇具有很好参考价值的文章主要介绍了java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

30、阶段综合案例(带权重的随机&每日一记)

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

制造假数据

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java
java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

获取姓氏: https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0

男生名字: http://www.haoming8.cn/baobao/10881.html

获取女生名字: http://www.haoming8.cn/baobao/7641.html

Test1

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test1 {
    public static void main(String[] args) throws IOException {
        /*
         制造假数据:
             获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
             获取男生名字:http://www.haoming8.cn/baobao/10881.html
             获取女生名字:http://www.haoming8.cn/baobao/7641.html
        */

        //1.定义变量用来记录网址
        String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
        String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
        String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";

        //2.爬取数据,把网址上所有的数据拼接成一个字符串
        String familyNameStr = webCrawler(familyNameNet);
        //System.out.println("familyNameStr = " + familyNameStr);

        String boyNameStr = webCrawler(boyNameNet);
        //System.out.println("boyNameStr = " + boyNameStr);

        String girlNameStr = webCrawler(girlNameNet);
        //System.out.println("girlNameStr = " + girlNameStr);

        //3.通过正则表达式,把其中符合要求的数据获取出来
        //  .{4}(,|。)
        //  (.{4})(,|。)
        ArrayList<String> familyNameTempList = getData(familyNameStr, "(.{4})(,|。)", 1);
        System.out.println("familyNameTempList = " + familyNameTempList);

        //..(、|。)
        //(..)(、|。)
        //([\u4E00-\u9FA5]{2})(、|。)
        ArrayList<String> boyNameTempList = getData(boyNameStr, "([\\u4E00-\\u9FA5]{2})(、|。)", 1);
        System.out.println("boyNameTempList = " + boyNameTempList);

        //(.. ){4}..
        ArrayList<String> girlNameTempList = getData(girlNameStr, "(.. ){4}..", 0);
        System.out.println("girlNameTempList = " + girlNameTempList);

        //4.处理数据
        //familyNameTempList(姓氏)
        //处理方案:把每一个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyNameList = new ArrayList<>();
        for (String str : familyNameTempList) {
            // 赵钱孙李     周吴郑王    冯陈褚卫    蒋沈韩杨    朱秦尤许
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                //System.out.println("c = " + c);
                familyNameList.add(c + "");
            }
        }
        System.out.println("familyNameList = " + familyNameList);

        //boyNameTempList(男生的名字)
        //处理方案:去除其中的重复方案
        ArrayList<String> boyNameList = new ArrayList<>();
        for (String str : boyNameTempList) {
            if (!boyNameList.contains(str)) {
                boyNameList.add(str);
            }
        }
        System.out.println("boyNameList = " + boyNameList);

        //girlNameTempList(女生的名字)
        //处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字
        ArrayList<String> girlNameList = new ArrayList<>();
        for (String str : girlNameTempList) {
            String[] arr = str.split(" ");
            for (int i = 0; i < arr.length; i++) {
                girlNameList.add(arr[i]);
            }
        }
        System.out.println("girlNameList = " + girlNameList);

        //5.生成数据
        //姓名(唯一)-性别-年龄
        ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 1300, 1400);
        Collections.shuffle(list);
        System.out.println("list = " + list);

        //6.写出数据
        BufferedWriter bw = new BufferedWriter(new FileWriter("day28-myiotest\\file\\names.txt"));
        for (String str : list) {
            bw.write(str);
            bw.newLine();
        }

        //7.释放资源
        bw.close();
    }

    /**
     * 作用:获取男生和女生的信息:张三-男-23
     * <p>
     * 形参
     *
     * @param familyNameList 参数一:装着姓氏的集合
     * @param boyNameList    参数二:装着男生名字的集合
     * @param girlNameList   参数三:装着女生名字的集合
     * @param boyCount       参数四:男生的个数
     * @param girlCount      参数五:女生的个数
     * @return 返回字符串:张三-男-23
     */
    public static ArrayList<String> getInfos(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {

        //1.生成男生不重复的名字  张三
        HashSet<String> boyHs = new HashSet<>();
        while (true) {
            if (boyHs.size() == boyCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(boyNameList);
            boyHs.add(familyNameList.get(0) + boyNameList.get(0));
        }
        System.out.println("boyHs = " + boyHs);

        //2.生成女生不重复的名字  王二麻子
        HashSet<String> girlHs = new HashSet<>();
        while (true) {
            if (girlHs.size() == girlCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(girlNameList);
            girlHs.add(familyNameList.get(0) + girlNameList.get(0));
        }
        System.out.println("girlHs = " + girlHs);

        //3. 赵鸿光-男-23
        //   赵亦曼-女-25
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        //【18 ~ 27】
        //-18  0~9
        //尾巴 + 1  9 + 1 = 10
        for (String boyName : boyHs) {
            // boyName依次表示每一个男生的名字
            int age = r.nextInt(10) + 18;
            list.add(boyName + "-男-" + age);
        }

        //4.生成女生的信息并添加到集合当中
        //【18 ~ 25】
        //-18 0~7
        //尾巴+1 7+1=8
        for (String girlName : girlHs) {
            // girlName依次表示每一个女生的名字
            int age = r.nextInt(8) + 18; //0 ~ 7 + 18 = 18~25
            list.add(girlName + "-女-" + age);
        }

        return list;
    }

    /**
     * 作用:根据正则表达式获取字符串中的数据
     *
     * @param Str   参数一:完整的字符串
     * @param regex 参数二:正则表达式
     * @param index 参数三:获取数据
     *              0:获取符合正则表达式所有的内容
     *              1:获取正则表达式中第一组数据
     *              2:获取正则表达式中第二组数据
     *              ...以此类推
     * @return 返回值:真正相要的数据
     */
    private static ArrayList<String> getData(String Str, String regex, int index) {
        //1.创建集合存放数据
        ArrayList<String> list = new ArrayList<>();

        //2.按照正则表达式的规则,去获取数据
        Pattern pattern = Pattern.compile(regex);

        //3.按照pattern的规则,到Str当中获取数据
        Matcher matcher = pattern.matcher(Str);

        while (matcher.find()) {
            //满足要求的数据进行获取
            //String group = matcher.group(index);
            //System.out.println("group = " + group);
            list.add(matcher.group(index));
        }

        return list;
    }

    /**
     * 作用:从网络中爬取数据,把数据拼接成字符串返回
     *
     * @param net 形参:网址
     * @return 返回值:爬取到的所有数据
     */
    public static String webCrawler(String net) throws IOException {
        //1.定义StringBuilder拼接爬取到的数据
        StringBuilder sb = new StringBuilder();

        //2.创建一个URL对象
        URL url = new URL(net);

        //3.连接上这个网址
        //细节:保证网络是畅通的,而且这个网址是可以链接上的。
        URLConnection conn = url.openConnection();

        //4.读取数据
        //字节流
        //有中文---字节流转换成字符流
        InputStreamReader isr = new InputStreamReader(conn.getInputStream());//字节流转换成字符流
        int ch;
        while ((ch = isr.read()) != -1) {
            sb.append((char) ch);
        }

        //5.释放资源
        isr.close();

        //6.把读取到的数据返回
        return sb.toString();
    }
}

运行结果

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

Test2 – hutool-all-5.8.10.jar工具包的使用

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.HttpUtil;

import java.util.*;

public class Test2 {
    public static void main(String[] args) {
        /*
        利用糊涂包生成假数据,并写到文件当中

         制造假数据:
             获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
             获取男生名字:http://www.haoming8.cn/baobao/10881.html
             获取女生名字:http://www.haoming8.cn/baobao/7641.html
        */

        //1.定义变量用来记录网址
        String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
        String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
        String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";

        //2.爬取数据
        String familyNameStr = HttpUtil.get(familyNameNet);
        String boyNameStr = HttpUtil.get(boyNameNet);
        String girlNameStr = HttpUtil.get(girlNameNet);

        //3.利用正则表达式获取数据
        //通过正则表达式,把其中符合要求的数据获取出来
        List<String> familyNameTempList = ReUtil.findAll("(.{4})(,|。)", familyNameStr, 1);
        List<String> boyNameTempList = ReUtil.findAll("([\\u4E00-\\u9FA5]{2})(、|。)", boyNameStr, 1);
        List<String> girlNameTempList = ReUtil.findAll("(.. ){4}..", girlNameStr, 0);
        System.out.println("familyNameTempList = " + familyNameTempList);
        System.out.println("boyNameTempList = " + boyNameTempList);
        System.out.println("girlNameTempList = " + girlNameTempList);

        //4.处理数据
        //familyNameTempList(姓氏)
        //处理方案:把每一个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyNameList = new ArrayList<>();
        for (String str : familyNameTempList) {
            // 赵钱孙李     周吴郑王    冯陈褚卫    蒋沈韩杨    朱秦尤许
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                //System.out.println("c = " + c);
                familyNameList.add(c + "");
            }
        }
        System.out.println("familyNameList = " + familyNameList);

        //boyNameTempList(男生的名字)
        //处理方案:去除其中的重复方案
        ArrayList<String> boyNameList = new ArrayList<>();
        for (String str : boyNameTempList) {
            if (!boyNameList.contains(str)) {
                boyNameList.add(str);
            }
        }
        System.out.println("boyNameList = " + boyNameList);

        //girlNameTempList(女生的名字)
        //处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字
        ArrayList<String> girlNameList = new ArrayList<>();
        for (String str : girlNameTempList) {
            String[] arr = str.split(" ");
            for (int i = 0; i < arr.length; i++) {
                girlNameList.add(arr[i]);
            }
        }
        System.out.println("girlNameList = " + girlNameList);

        //5.生成数据
        //姓名(唯一)-性别-年龄
        ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 1300, 1400);
        Collections.shuffle(list);
        System.out.println("list = " + list);

        //6.写出数据
        //细节:
        //糊涂包的相对路径,不是相对于当前项目而言的,而是相对class文件而言的
        FileUtil.writeLines(list,"day28-myiotest\\file\\names.txt","UTF-8");
    }

    /**
     * 作用:获取男生和女生的信息:张三-男-23
     * <p>
     * 形参
     *
     * @param familyNameList 参数一:装着姓氏的集合
     * @param boyNameList    参数二:装着男生名字的集合
     * @param girlNameList   参数三:装着女生名字的集合
     * @param boyCount       参数四:男生的个数
     * @param girlCount      参数五:女生的个数
     * @return 返回字符串:张三-男-23
     */
    public static ArrayList<String> getInfos(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {

        //1.生成男生不重复的名字  张三
        HashSet<String> boyHs = new HashSet<>();
        while (true) {
            if (boyHs.size() == boyCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(boyNameList);
            boyHs.add(familyNameList.get(0) + boyNameList.get(0));
        }
        System.out.println("boyHs = " + boyHs);

        //2.生成女生不重复的名字  王二麻子
        HashSet<String> girlHs = new HashSet<>();
        while (true) {
            if (girlHs.size() == girlCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(girlNameList);
            girlHs.add(familyNameList.get(0) + girlNameList.get(0));
        }
        System.out.println("girlHs = " + girlHs);

        //3. 赵鸿光-男-23
        //   赵亦曼-女-25
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        //【18 ~ 27】
        //-18  0~9
        //尾巴 + 1  9 + 1 = 10
        for (String boyName : boyHs) {
            // boyName依次表示每一个男生的名字
            int age = r.nextInt(10) + 18;
            list.add(boyName + "-男-" + age);
        }

        //4.生成女生的信息并添加到集合当中
        //【18 ~ 25】
        //-18 0~7
        //尾巴+1 7+1=8
        for (String girlName : girlHs) {
            // girlName依次表示每一个女生的名字
            int age = r.nextInt(8) + 18; //0 ~ 7 + 18 = 18~25
            list.add(girlName + "-女-" + age);
        }

        return list;
    }

}

运行结果

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

随机点名器

随机点名器1

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java
allnames1.txt

姜和悦--19
阙志高--22
傅晋运--25
郦琪瑶--25
明绮灵--19
阳香梅--18
厍韵轩--24
詹仪婕--21
乌棋道--25
安佳凌--20
离棋道--26
劳泽曲--25
鲍梅英--20
祁林帆--19
贺桦振--19
仲时辰--27
平德向--25
颜慕娴--18
笪劲轩--21
官若环--19
费涛阳--20
漆博方--23
仇文帆--19
怀代秋--20
冶曼珍--20
贡慕妍--19
蓬月莹--25
佘杰冠--23
穆碧春--25
郈嘉霜--20
易芷云--23
台风涛--19
国彬新--24
羊冠浩--21
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test {
    public static void main(String[] args) throws IOException {
         /*
            需求:
                有一个文件里面存储了班级同学的信息,每一个信息占一行。
                格式为:张三-男-23
                要求通过程序实现随机点名器。

            运行效果:
                第一次运行程序:随机同学姓名1(只显示名字)
                第二次运行程序:随机同学姓名2(只显示名字)
                第三次运行程序:随机同学姓名3(只显示名字)
                …
         */

        //1.读取文件中学生的姓名
        ArrayList<String> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("day28-myiotest\\file\\allnames1.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            list.add(line);
        }
        //释放资源
        br.close();

        //2.1.随机抽取(解法一)
        Random r = new Random();
        int index = r.nextInt(list.size());
        String randomName1 = list.get(index);
        String stu1 = randomName1.split("-")[0];
        System.out.println("stu1 = " + stu1);

        //2.2.随机抽取(解法二)
        Collections.shuffle(list);
        String stu2 = list.get(0).split("-")[0];
        System.out.println("stu2 = " + stu2);
    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

随机点名器2

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test {
    public static void main(String[] args) throws IOException {
        /*
        需求:
            一个文件里面存储了班级同学的信息,每一个学生信息占一行。
            格式为:张三-男-23
            要求通过程序实现随机点名器。

        运行效果:
            70%的概率随机到男生
            30%的概率随机到女生
            总共随机100万次,统计结果。
            注意观察:看生成男生和女生的比例是不是接近于7:3
        */

        //1.读取数据,并把男生和女生的信息添加到不同的集合当中
        ArrayList<String> boyNameList = new ArrayList<>();
        ArrayList<String> girlNameList = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("day28-myiotest\\file\\allnames1.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            String sex = line.split("-")[1];
            if ("男".equals(sex)) {
                boyNameList.add(line);
            } else if ("女".equals(sex)) {
                girlNameList.add(line);
            }
        }
        //释放资源
        br.close();

        //2.定义权重集合,男女比例 7:3
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0);

        //3.定义变量,统计被点的个数
        int boyCount = 0;
        int girlCount = 0;
        Random r = new Random();

        //4.循环100万次
        for (int i = 0; i < 1000000; i++) {
            //5.从权重集合中获取随机数据
            int index = r.nextInt(list.size());
            int weight = list.get(index);

            //6.判断获取的随机数据是1还是0
            if (weight == 1) {
                //1就随机男生
                Collections.shuffle(boyNameList);
                String boyInfo = boyNameList.get(0);
                System.out.println("boyInfo = " + boyInfo);
                boyCount++;
            } else {
                //0就随机女生
                Collections.shuffle(girlNameList);
                String girlInfo = girlNameList.get(0);
                System.out.println("girlInfo = " + girlInfo);
                girlCount++;
            }
        }

        System.out.println("随机抽取100万次,其中男生被抽到了" + boyCount);
        System.out.println("随机抽取100万次,其中女生被抽到了" + girlCount);
        System.out.println(boyCount + girlCount);

    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

随机点名器3

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;

public class Test {
    public static void main(String[] args) throws IOException {
        /*
              需求:
                一个文件里面存储了班级同学的姓名,每一个姓名占一行。
                要求通过程序实现随机点名器。
                第三次必定是张三同学

              运行效果:
                第一次运行程序:随机同学姓名1
                第二次运行程序:随机同学姓名2
                第三次运行程序:张三
                …
         */

        //1.读取数据,并把学生的信息添加到集合当中
        ArrayList<String> list = new ArrayList<>();
        BufferedReader br1 = new BufferedReader(new FileReader("day28-myiotest\\file\\allnames1.txt"));
        String line;
        while ((line = br1.readLine()) != null) {
            list.add(line);
        }
        //释放资源
        br1.close();

        //2.读取当前程序已经运行的次数
        BufferedReader br2 = new BufferedReader(new FileReader("day28-myiotest\\file\\count.txt"));
        String countStr = br2.readLine();
        int count = Integer.parseInt(countStr);
        System.out.println("count = " + count);
        //释放资源
        br2.close();

        //3.表示程序再次运行一次
        count++;
        System.out.println("count = " + count);

        //4.判断。如果当前已经是第三次,直接打印,不是第三次才随机
        if (count == 3) {
            System.out.println("张三");
        } else {
            Collections.shuffle(list);
            String stuInfo = list.get(0);
            String[] arr = stuInfo.split("-");
            String stuName = arr[0];
            System.out.println("stuName = " + stuName);
        }

        //5.将程序的运行次数写入本地文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("day28-myiotest\\file\\count.txt"));
        bw.write(count + "");
        //释放资源
        bw.close();
    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

随机点名器4

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

	阴诗雁-女-25
	屈燕妮-女-24
	钦逸抒-女-21
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;

public class Test {
    public static void main(String[] args) throws IOException {
        /*
        需求:
            一个文件里面存储了班级同学的姓名,每一个姓名占一行。
            要求通过程序实现随机点名器。

          运行结果:
            被点到的学生不会再被点到。
            但是如果班级中所有的学生都点完了, 需要自动的重新开启第二轮点名。
            细节1:假设班级有10个学生,每一轮中每一位学生只能被点到一次,程序运行10次,第一轮结束
            细节2:第11次运行的时候,我们自己不需要手动操作本地文件,要求程序自动开始第二轮点名

          核心思想:
               点一个删一个,把删除的备份,全部点完时还原数据。
        */

        //1.定义变量,表示初始文件路径,文件中存储所有的学生信息
        String src = "day28-myiotest\\file\\allnames.txt";

        //2.定义变量,表示备份文件,一开始文件为空
        String backups = "day28-myiotest\\file\\backups.txt";

        //3.读取初始文件中的数据,并把学生信息添加到集合当中
        ArrayList<String> list = readFile(src);

        //4.判断集合中是否有数据
        if (list.size() == 0) {
            //5.如果没有数据,表示学生已经点完,从backups.txt中还原数据即可
            //还原数据需要以下步骤:
            //5.1 读取备份文件中的所有数据
            list = readFile(backups);

            //5.2 把所有的数据写到初始文件中
            writeFile(src, list, false);

            //5.3 删除备份文件
            new File(backups).delete();
        }

        //5.集合中有数据,表示还没有点完,点一个删一个,把删除的备份到backups.txt当中
        //打乱集合
        Collections.shuffle(list);

        //获取0索引的学生信息并删除
        String stuInfo = list.remove(0);

        //打印随机到的学生信息
        System.out.println("被点到的学生信息为:" + stuInfo);

        //把删除之后的所有学生信息,写到初始文件中
        writeFile(src, list, false);

        //把删除的学生信息备份(追加写入)
        writeFile(backups, stuInfo, true);
    }

    /**
     * 把删除的学生信息备份(追加写入)
     *
     * @param pathFile 备份文件路径
     * @param stu      备份学生信息
     * @param isAppend 是否追加写入
     * @throws IOException 抛出异常
     */
    private static void writeFile(String pathFile, String stu, boolean isAppend) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter(pathFile, isAppend));
        bw.write(stu);
        bw.newLine();
        bw.close();
    }

    /**
     * 把所有的数据写到初始文件中,还原数据
     *
     * @param pathFile 初始文件的路径
     * @param list     备份的学生集合
     * @param isAppend 是否在文件中追加数据,不追加表示重写
     * @throws IOException 抛出异常
     */
    private static void writeFile(String pathFile, ArrayList<String> list, boolean isAppend) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter(pathFile, isAppend));
        for (String str : list) {
            bw.write(str);
            bw.newLine();
        }
        bw.close();
    }

    /**
     * 读取初始文件中的数据,并把学生信息添加到集合当中
     *
     * @param pathFile 初始文件的路径
     * @return 返回学生信息集合
     * @throws IOException 抛出异常
     */
    private static ArrayList<String> readFile(String pathFile) throws IOException {
        ArrayList<String> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader(pathFile));
        String line;
        while ((line = br.readLine()) != null) {
            list.add(line);
        }
        //释放资源
        br.close();
        return list;
    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

随机点名器5 【带权重的随机算法】

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;

/*
钦逸抒-女-21-0.5
屈燕妮-女-24-1.0
阴诗雁-女-25-1.0
伯荷燕-女-24-1.0
欧文新-男-20-0.5
董泽欧-男-18-1.0
滕星磊-男-18-1.0
阚晴岚-女-22-1.0
傅彬远-男-19-1.0
左花依-女-24-0.25
 */
public class Test {
    public static void main(String[] args) throws IOException {
        /*
        TxT文件中事先准备好一些学生信息,每个学生的信息独占一行。
        要求1 : 每次被点到的学生,再次被点到的概率在原先的基础上降低一半。
        举例 : 80个学生,点名5次,每次都点到小A,概率变化情况如下 :
                第一次每人概率:1.25%。
                第二次小A概率 : 0.625%。     其他学生概率 : 1.2579%
                第三次小A概率 : 0.3125%。    其他学生概率 : 1.261867%
                第四次小A概率 : 0.15625%。   其他学生概率 : 1.2638449%
                第五次小A概率 : 0.078125%。  其他学生概率 : 1.26483386%
        提示 : 本题的核心就是带权重的随机算法
        提示 : 本题需要用到集合,IO,权重随机算法,有基础的同学可以试试,0基础的同学等 IO学完之后再做。
         */

        //1.把文件中所有的学生信息读取到内存中
        ArrayList<Student> stuList = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("day28-myiotest\\file\\names6.txt"));
        String line;
        while ((line = br.readLine()) != null) {
            String[] arr = line.split("-");
            stuList.add(new Student(arr[0], arr[1], Integer.parseInt(arr[2]), Double.parseDouble(arr[3])));
        }
        //释放资源
        br.close();

        System.out.println("stuList = " + stuList);

        //2.计算权重的总和
        double weight = 0;
        for (Student stu : stuList) {
            weight += stu.getWeight();
        }
        System.out.println("weight = " + weight);

        //3.计算每一个人的实际占比
        double[] arr = new double[stuList.size()];
        int index1 = 0;
        for (Student stu : stuList) {
            arr[index1] = stu.getWeight() / weight;
            index1++;
        }
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));

        //4.计算每一个人的权重占比范围
        for (int i = 1; i < arr.length; i++) {
            arr[i] += arr[i - 1];
        }
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));

        //5.随机抽取
        //获取一个0.0~0.1之间的随机数
        double number = Math.random();
        System.out.println("number = " + number);
        //判断number在arr中的位置
        //二分查找法
        //方法回返回: - 插入点 - 1
        //获取number这个数据在数组当中的插入点位置
        int index2 = Arrays.binarySearch(arr, number);
        System.out.println("index2 = " + index2);
        int result = -Arrays.binarySearch(arr, number) - 1;
        System.out.println("result = " + result);
        Student stu = stuList.get(result);
        System.out.println("stu = " + stu);

        //6.修改当前学生的权重
        double w = stu.getWeight() / 2;
        stu.setWeight(w);
        System.out.println("stuList = " + stuList);

        //7.把集合中的数据再次写到文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("day28-myiotest\\file\\names6.txt"));
        for (Student student : stuList) {
            //bw.write(student.getName() + "-" + student.getGender() + "-" + student.getAge() + "-" + student.getWeight());
            bw.write(student.toLine());
            bw.newLine();
        }
        //释放资源
        bw.close();
    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

登录注册

写一个登陆小案例

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws IOException {
        /*
            需求:写一个登陆小案例。

            步骤:
            将正确的用户名和密码手动保存在本地的userinfo.txt文件中。
            保存格式为:username=zhangsan&password=123
            让用户键盘录入用户名和密码
                比较用户录入的和正确的用户名密码是否一致
            如果一致则打印登陆成功
                如果不一致则打印登陆失败
         */

        //1.读取正确的用户名和密码
        BufferedReader br = new BufferedReader(new FileReader("day28-myiotest\\file\\userinfo.txt"));
        String line = br.readLine();//username=zhangsan&password=123
        br.close();

        System.out.println("line = " + line);

        String[] userInfo = line.split("&");
        String[] arr1 = userInfo[0].split("=");
        String[] arr2 = userInfo[1].split("=");

        String rightUserName = arr1[1];
        String rightPasswordName = arr2[1];
        System.out.println("rightUserName = " + rightUserName);
        System.out.println("rightPasswordName = " + rightPasswordName);

        //2.让用户键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();

        //3.比较
        if (rightUserName.equals(username) && rightPasswordName.equals(password)) {
            System.out.println("登录成功!!!");
        } else {
            System.out.println("登录失败!!!");
        }

    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

写一个登陆小案例(添加锁定账户功能)

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

import java.io.*;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws IOException {
        /*
            需求:写一个登陆小案例(添加锁定账户功能)。

            步骤:
            将正确的用户名和密码手动保存在本地的 userinfo2.txt文件中。
            保存格式为:username=zhangsan&password=123&count=0
            让用户键盘录入用户名和密码
                比较用户录入的和正确的用户名密码是否一致
            如果一致则打印登陆成功
                如果不一致则打印登陆失败,连续输三次被锁定
         */

        //1.读取正确的用户名和密码
        BufferedReader br = new BufferedReader(new FileReader("day28-myiotest\\file\\userinfo2.txt"));
        String line = br.readLine();//username=zhangsan&password=123&count=0
        br.close();

        System.out.println("line = " + line);

        String[] userInfo = line.split("&");
        String[] arr1 = userInfo[0].split("=");
        String[] arr2 = userInfo[1].split("=");
        String[] arr3 = userInfo[2].split("=");

        String rightUserName = arr1[1];
        String rightPasswordName = arr2[1];
        //count:表示用户连续输错的次数
        int rightCount = Integer.parseInt(arr3[1]);


        //2.让用户键盘录入用户名和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();

        //3.比较
        if (rightUserName.equals(username) && rightPasswordName.equals(password) && rightCount < 3) {
            String content = "username=" + rightUserName + "&password=" + rightPasswordName + "&count=0";
            writeInfo(content);
            System.out.println("登录成功");
        } else if (rightCount == 3) {
            System.out.println("连续输错三次,账户被锁定。。。。");
        } else {
            System.out.println("登陆失败,还剩下" + (3 - rightCount) + "次机会");
            rightCount++;
            //写入
            BufferedWriter bw = new BufferedWriter(new FileWriter("day28-myiotest\\file\\userinfo2.txt"));
            String content = "username=" + rightUserName + "&password=" + rightPasswordName + "&count=" + rightCount;
            bw.write(content);
            bw.close();
            System.out.println("登录失败");
        }

    }
    
    /**
     * 作用:写出一个字符串到本地文件中
     *
     * @param content 参数:要写出的字符串
     * @throws IOException 异常
     */
    public static void writeInfo(String content) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("day28-myiotest\\file\\userinfo2.txt"));
        bw.write(content);
        bw.close();
    }
    
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

补全拼图小游戏的登录注册

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java
java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java
java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java
java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java
java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

给拼图小游戏的登录增加以下功能:密码连续输入3次,当前账号被锁定

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

游戏存档和读档

游戏配置

Properties的基本使用

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

  • Test1
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Test1 {
    public static void main(String[] args) {
        /*
            Properties作为Map集合的操作
         */

        //1.创建集合的对象
        Properties prop = new Properties();

        //2.添加数据
        // 细节:虽然我们可以往Properties当中添加任意的数据类型,但是一般只会往里面添加字符串类型的数据
        prop.put("aaa", "bbb");
        prop.put("aaa", "bbb");
        prop.put("ccc", "111");
        prop.put("ddd", "222");
        prop.put("eee", "bbb");

        //3.打印集合
        System.out.println("prop = " + prop);

        //4.遍历集合
        System.out.println("-----------------------------");
        Set<Object> keys = prop.keySet();
        for (Object key : keys) {
            Object value = prop.get(key);
            System.out.println(key + " : " + value);
        }

        System.out.println("-----------------------------");
        Set<Map.Entry<Object, Object>> entries = prop.entrySet();
        for (Map.Entry<Object, Object> entry : entries) {
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println(key + " : " + value);
        }

    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java

import java.io.*;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Test2 {
    public static void main(String[] args) throws IOException {
        /*
            Properties跟IO流结合的操作
         */

        //1.创建集合的对象
        Properties prop = new Properties();

        //2.添加数据
        prop.put("aaa", "bbb");
        prop.put("aaa", "bbb");
        prop.put("ccc", "111");
        prop.put("ddd", "222");
        prop.put("eee", "bbb");

        //3.把集合中的数据以键值对的形式写到本地文件当中
        FileOutputStream fos=new FileOutputStream(new File("day28-myiotest/file/b.properties"));
        prop.store(fos, "test");
        fos.close();

        /*BufferedWriter bw = new BufferedWriter(new FileWriter("day28-myiotest/file/a.properties"));
        Set<Map.Entry<Object, Object>> entries = prop.entrySet();
        for (Map.Entry<Object, Object> entry : entries) {
            Object key = entry.getKey();
            Object value = entry.getValue();
            bw.write(key + "=" + value);
            bw.newLine();
        }
        //释放资源
        bw.close();*/

    }
}
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class Test3 {
    public static void main(String[] args) throws IOException {
        /*
            读取本地Properties文件里面的数据
         */

        //1.创建Properties集合对象
        Properties prop = new Properties();

        //2.读取本地Properties文件里面的数据
        FileInputStream fis = new FileInputStream("day28-myiotest/file/b.properties");
        prop.load(fis);
        fis.close();

        //3.打印集合
        System.out.println("prop = " + prop);
    }
}

java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】,java入门,java文章来源地址https://www.toymoban.com/news/detail-544578.html

每日一记

到了这里,关于java基础入门-21-【阶段综合案例(带权重的随机&每日一记)】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript极速入门-综合案例(3)

    预期效果 代码实现 预期效果   需求: 按要求在文本框中输入内容,点击提交按钮,输入内容显示在页面下方. 代码实现 1.提前准备如下HTML和CSS代码 2.实现提交     1.HTML是一种超文本标记语言,主要用于页面内容的显示和排版.如果需要更漂亮的样式展示和页面效果,需要搭配CSS和

    2024年03月14日
    浏览(46)
  • Vue生命周期;综合案例;工程化开发入门

    思考: 什么时候可以发送初始化渲染请求?(越早越好:最早可以早到什么时候?) 什么时候可以开始 操作dom ?(至少dom得渲染出来) Vue生命周期 :一个Vue实例从***创建***到***销毁***的整个过程 new Vue( ) ①创建(生命就开始了)→②挂载→③更新→④销毁(比如网页被关

    2024年01月23日
    浏览(48)
  • 前端基础第一天-html-综合案例

    通过综合案例,主要复习: 目录文件夹 今日所学标签 路径 锚点链接

    2024年02月14日
    浏览(47)
  • Java案例----生成随机验证码

    在登录中常常会需要用到验证码,那你知道如何生成随机的验证码码? 本次的需求是生成一个由字母和数字组成的验证码,其中字母可以大小写或者重复需占4为大小,数字为0-9中的任意一个,只占1位大小,但是数字的位置可以任何位置,主要思路就是将需要用到的元素存入

    2024年02月11日
    浏览(58)
  • 《嵌入式入门-模电基础》第二阶段

    科技的不断发展,给计算机行业带来了很多机会, 嵌 入式开发的前景也越来越广阔, 过去的嵌入式是:电器、机械、交通设备。现在的嵌入式是:手机、智能家居、物联网、新能源、新基建、芯片...... 随着国家政策的倾斜,实业发展的需求, 市场对嵌入式人才的“渴求”

    2024年02月16日
    浏览(43)
  • 随机、优先与权重——非平均概率的选择工具

    除了汇编语言这样的另类,常规的编程语言几乎都提供了按平均概率生成整数或者浮点数的标准库。这也是应用开发中非常基本的功能。不过,有时候我们需要一些关于随机性的更复杂的功能。 这种复杂性主要来自两个方面:非平均的随机分布和随机结果的使用方式。 非平

    2023年04月15日
    浏览(38)
  • Pyspark综合案例(pyspark安装和java运行环境配置)

    一、RDD对象 PySpark支持多种数据的输入,在输入完成后,都会得到一个:RDD类的对象 RDD全称为:弹性分布式数据集(Resilient Distributed Datasets) PySpark针对数据的处理,都是以RDD对象作为载体,即: 数据存储在RDD内 各类数据的计算方法,也都是RDD的成员方法 RDD的数据计算方法

    2024年04月24日
    浏览(41)
  • 【Java虚拟机】JVM调优和分析案例综合实战

    1.什么是JVM性能优化 jvm性能优化涉及到两个很重要的概念:吞吐量和响应时间。jvm调优主要是针对他们进行调整优化,达到一个理想的目标,根据业务确定目标是吞吐量优先还是响应时间优先。 吞吐量:用户代码执行时间/(用户代码执行时间+GC执行时间)。 响应时间:整个接

    2024年02月03日
    浏览(40)
  • Python-Python基础综合案例:数据可视化 - 折线图可视化

    当前版本号[20230729]。 版本 修改说明 20230729 初版 效果一:2020年印美日新冠累计确诊人数 ​ 2020年是新冠疫情爆发的一年, 随着疫情的爆发, 国内外确诊人数成了大家关心的热点, 相信大家都有看过类似的疫情报告. 本案例对印度美国日本三个国家确诊人数的进行了可视化处理

    2024年02月15日
    浏览(50)
  • 因果推断阶段系列21[阶段2-3]----因果模型评估

    大部分关于因果性的资料中,研究人员使用模拟数据来检查他们的方法是否有效。就像我们在一章中所做的那样,模拟生成关于 Y 0 i Y_{0i}

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包