day30-IO-阶段综合案例(带权重的随机每日一记)(笔记完全来源于黑马程序员)

news2025/5/14 7:15:33

目录

  • 0 目录
  • 一、听黑马阿玮的视频记录的笔记
    • 1. 制造假数据
      • 1.1 如何制造假数据
      • 1.2 练习1-生成方式1:爬取姓氏、男生名字、女生名字
      • 1.3 练习2-生成方式1:在练习1的基础上,将数据写入本地文件
      • 1.4 练习3-生成方式2:利用糊涂包生成假数据
    • 2.随机点名器
      • 2.1 练习:前4个练习以及对应代码
        • 2.1.1 需求与代码
        • 2.1.2 需求与代码
        • 2.1.3 需求与代码
        • 2.1.4 需求与代码
      • 2.2 练习:随机点名器5
    • 3.登录注册
      • 3.1 练习:登录注册1
      • 3.2 练习:登录注册2(需独立完成)
      • 3.3 练习:登录注册3
      • 3.4 练习:登录注册4(需独立完成)
    • 4.游戏存档和读档
      • 3.1 练习:游戏存档
      • 3.2 练习:游戏读档
      • 3.3 练习:数据同步
    • 5.游戏配置
      • 5.1 properties的基本使用
        • 5.1.1 什么是配置文件
        • 5.1.2 配置文件的好处
        • 5.1.3 常见的配置文件
        • 5.1.4 properties配置文件
        • 5.1.5 练习:Properties作为Map集合的操作
        • 5.1.6 练习:Properties跟IO流结合的操作
        • 5.1.7 练习:读取本地Properties文件里面的数据
      • 5.2 练习:游戏配置
    • 6.每日一记
      • 6.1 练习1:课后作业
      • 6.1 练习2:导出和导入的功能 - 基于练习1的课后作业
  • 页末

  说明:该笔记是根据黑马程序员在B站上分享的视频 黑马程序员Java零基础视频教程_下部的资料而整理的笔记, 完全来源于黑马程序员,若有侵权,请联系本人删除,个人加了空格,也根据视频 加了一些内容、详细的运行结果图与源码图。笔记难免可能出现错误或笔误, 若读者发现笔记有错误,欢迎在评论里批评指正。关于 前十三章笔记,个人在知乎上有所记录,很详细,但时间来不急了,不能慢慢记录了,对应链接: 知乎上的Java笔记。 笔记于2024.12.7在开始记录,12.8记录完毕。

  (废话一句。目前经济环境很差,转Java的相当多,不一定是最佳选择,会挤得头破血流。建议大家也可以考虑分流,C++(学了语言后,往语音信号处理、嵌入式等地方再搞一搞)、嵌入式、FPGA、硬件(硬件,很多企业会用到,有机会、有能力、有条件的,建议试试)、考公选调与国考、电网。)
  另外,本章应该会有点爬虫知识,所以特此声明请合法合理使用爬虫,不爬取任何涉密以及涉及隐私的内容,合理控制请求次数,爬取的内容未经授权请不要用于商用,保护自己,免受牢狱之灾。
在这里插入图片描述

0 目录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、听黑马阿玮的视频记录的笔记

1. 制造假数据

  注:对应视频为:1O流-45-综合练习01-网络爬虫(爬取姓氏)IO流-46-综合练习02-网络爬虫(爬取名字)IO流-47-综合练习03-网络爬虫(数据处理)IO流-48-综合练习04-网络爬虫(数据处理并写出)IO流-49-综合练习05-利用糊涂包生成假数据

1.1 如何制造假数据

在这里插入图片描述
在这里插入图片描述

1.2 练习1-生成方式1:爬取姓氏、男生名字、女生名字

  对应视频为:1O流-45-综合练习01-网络爬虫(爬取姓氏)IO流-46-综合练习02-网络爬虫(爬取名字)IO流-47-综合练习03-网络爬虫(数据处理)IO流-48-综合练习04-网络爬虫(数据处理并写出),不理解的地方请在视频中直接听,比纯看博客好理解得多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  Test1

package com.itheima.myiotest1;

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);
        String boyNameStr = webCrawler(boyNameNet);
        String girlNameStr = webCrawler(girlNameNet);

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

        //4.处理数据
        //familyNameTempList(姓氏)
        //处理方案:把每一个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyNameList = new ArrayList<>();
        for (String str : familyNameTempList) {
            //str 赵钱孙李  周吴郑王   冯陈褚卫   蒋沈韩杨
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                familyNameList.add(c + "");
            }
        }
        //boyNameTempList(男生的名字)
        //处理方案:去除其中的重复元素
        ArrayList<String> boyNameList = new ArrayList<>();
        for (String str : boyNameTempList) {
            if(!boyNameList.contains(str)){
                boyNameList.add(str);
            }
        }
        //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]);
            }
        }

        //5.生成数据
        //姓名(唯一)-性别-年龄
        ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);
        Collections.shuffle(list);


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


    }

    /*
    * 作用:
    *      获取男生和女生的信息:张三-男-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));
        }
        //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));
        }
        //3.生成男生的信息并添加到集合当中
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        //【18 ~ 27】
        for (String boyName : boyhs) {
            //boyName依次表示每一个男生的名字
            int age = r.nextInt(10) + 18;
            list.add(boyName + "-男-" + age);
        }
        //4.生成女生的信息并添加到集合当中
        //【18 ~ 25】
        for (String girlName : girlhs) {
            //girlName依次表示每一个女生的名字
            int age = r.nextInt(8) + 18;
            list.add(girlName + "-女-" + age);
        }
        return list;
    }



    /*
    * 作用:根据正则表达式获取字符串中的数据
    * 参数一:
    *       完整的字符串
    * 参数二:
    *       正则表达式
    * 参数三:
    *      获取数据
    *       0:获取符合正则表达式所有的内容
    *       1:获取正则表达式中第一组数据
    *       2:获取正则表达式中第二组数据
    *       ...以此类推
    *
    * 返回值:
    *       真正想要的数据
    *
    * */
    private static ArrayList<String> getData(String str, String regex,int index) {
        //1.创建集合存放数据
        ArrayList<String> list = new ArrayList<>();
        //2.按照正则表达式的规则,去获取数据
        Pattern pattern = Pattern.compile(regex);
        //按照pattern的规则,到str当中获取数据
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()){
            list.add(matcher.group(index));
        }
        return list;

    }


    /*
    * 作用:
    *   从网络中爬取数据,把数据拼接成字符串返回
    * 形参:
    *   网址
    * 返回值:
    *   爬取到的所有数据
    * */
    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();
    }
}

  运行结果 - 爬取姓氏网址后获取的网页源码
在这里插入图片描述
  运行结果 - 爬取男生名字网址后获取的网页源码
在这里插入图片描述
  运行结果 - 根据姓氏的网页源码获取姓氏,使用正则表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  然后,为了得到男生名字,我们需要在网页中观察数据。
在这里插入图片描述
  运行结果 - 根据男生名字的网页源码获取男生名字,使用正则表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  运行结果 - 根据女生名字的网页源码获取女生名字,使用正则表达式
在这里插入图片描述
在这里插入图片描述
  运行结果 - 进一步处理获取到的姓氏数据,将姓氏提取出来
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  运行结果 - 进一步处理获取到的男生名字数据,将男生名字提取出来
在这里插入图片描述
在这里插入图片描述
  运行结果 - 进一步处理获取到的女生名字数据,将女生名字提取出来
在这里插入图片描述
在这里插入图片描述
  运行结果 - 随机生成不重复的男生的姓名
在这里插入图片描述
  运行结果 - 随机生成不重复的女生的姓名
在这里插入图片描述
  运行结果 - 随机生成不重复的且带年龄的姓名

  • 第1张图的名字没被打乱
    这张图的名字还没被打乱
  • 第2张图的名字被打乱了
    在这里插入图片描述

1.3 练习2-生成方式1:在练习1的基础上,将数据写入本地文件

  对应视频为:IO流-48-综合练习04-网络爬虫(数据处理并写出),不理解的地方请在视频中直接听,比纯看博客好理解得多。
  剩余代码见练习1的Test1。
  运行结果 - 将数据写入本地文件
在这里插入图片描述

1.4 练习3-生成方式2:利用糊涂包生成假数据

  对应视频为:IO流-49-综合练习05-利用糊涂包生成假数据,不理解的地方请在视频中直接听,比纯看博客好理解得多。
  在糊涂包的文档中查看爬虫的代码示例。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
  Test2

package com.itheima.myiotest1;


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){
        //利用糊涂包生成假数据,并写到文件当中

        //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);
        System.out.println(boyNameTempList);
        System.out.println(girlNameTempList);

        //4.处理数据
        //familyNameTempList(姓氏)
        //处理方案:把每一个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyNameList = new ArrayList<>();
        for (String str : familyNameTempList) {
            //str 赵钱孙李  周吴郑王   冯陈褚卫   蒋沈韩杨
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                familyNameList.add(c + "");
            }
        }
        //boyNameTempList(男生的名字)
        //处理方案:去除其中的重复元素
        ArrayList<String> boyNameList = new ArrayList<>();
        for (String str : boyNameTempList) {
            if(!boyNameList.contains(str)){
                boyNameList.add(str);
            }
        }
        //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]);
            }
        }

        //5.生成数据
        //姓名(唯一)-性别-年龄
        ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);
        Collections.shuffle(list);

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

    }

    /*
     * 作用:
     *      获取男生和女生的信息:张三-男-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));
        }
        //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));
        }
        //3.生成男生的信息并添加到集合当中
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        //【18 ~ 27】
        for (String boyName : boyhs) {
            //boyName依次表示每一个男生的名字
            int age = r.nextInt(10) + 18;
            list.add(boyName + "-男-" + age);
        }
        //4.生成女生的信息并添加到集合当中
        //【18 ~ 25】
        for (String girlName : girlhs) {
            //girlName依次表示每一个女生的名字
            int age = r.nextInt(8) + 18;
            list.add(girlName + "-女-" + age);
        }
        return list;
    }
}

  写代码的过程时的小细节
在这里插入图片描述
  运行结果 - 使用hutool初步获取网页中的姓氏、男生名字、女生名字
在这里插入图片描述
  运行结果 - 处理数据、写出数据到本地文件(剩下代码除写入文件外,其余与方式1同)
在这里插入图片描述

2.随机点名器

  注:对应视频为:IO流-50-综合练习06-随机点名器的四个需求IO流-51-综合练习07-带权重的随机算法
在这里插入图片描述

2.1 练习:前4个练习以及对应代码

  对应视频为:IO流-50-综合练习06-随机点名器的四个需求

2.1.1 需求与代码

在这里插入图片描述
  Test

package com.itheima.myiotest2;

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("myiotest\\src\\com\\itheima\\myiotest2\\names.txt"));
        String line;
        while ((line = br.readLine()) != null){
            list.add(line);
        }
        br.close();

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


        //2.随机抽取(解法二)
        Collections.shuffle(list);
        String randomName2 = list.get(0);
        String[] arr2 = randomName2.split("-");
        System.out.println(arr2[0]);


    }
}

2.1.2 需求与代码

在这里插入图片描述
  Test

package com.itheima.myiotest3;

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("myiotest\\src\\com\\itheima\\myiotest3\\names.txt"));
        String line;
        while ((line = br.readLine()) != null){
            String[] arr = line.split("-");
            if(arr[1].equals("男")){
                boyNameList.add(line);
            }else{
                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);
                boyCount++;
            }else{
                //0就随机女生
                Collections.shuffle(girlNameList);
                String girlInfo = girlNameList.get(0);
                System.out.println(girlInfo);
                girlCount++;
            }
        }

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

    }
}

2.1.3 需求与代码

在这里插入图片描述
  Test

package com.itheima.myiotest4;

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("myiotest\\src\\com\\itheima\\myiotest4\\names.txt"));
        String line;
        while ((line = br1.readLine()) != null){
            list.add(line);
        }
        br1.close();
        //2.读取当前程序已经运行的次数
        BufferedReader br2 = new BufferedReader(new FileReader("myiotest\\src\\com\\itheima\\myiotest4\\count.txt"));
        String countStr = br2.readLine();
        int count = Integer.parseInt(countStr);
        br2.close();
        //4.表示程序再次运行了一次
        count++;
        //3.判断,如果当前已经是第三次,直接打印,不是第三次才随机
        if(count == 3){
            System.out.println("张三");
        }else {
            Collections.shuffle(list);
            String stuInfo = list.get(0);
            System.out.println(stuInfo);
        }

        //4.将程序已经运行的次数写会本地文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("myiotest\\src\\com\\itheima\\myiotest4\\count.txt"));
        bw.write(count + "");
        bw.close();



    }
}
2.1.4 需求与代码

在这里插入图片描述
在这里插入图片描述
  Test

package com.itheima.myiotest5;

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

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

          运行结果要求:
            被点到的学生不会再被点到。
            但是如果班级中所有的学生都点完了, 需要重新开启第二轮点名。

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

        */

        //1.定义变量,表示初始文件路径,文件中存储所有的学生信息
        String src = "myiotest\\src\\com\\itheima\\myiotest5\\names.txt";
        //2.定义变量,表示备份文件,一开始文件为空
        String backups = "myiotest\\src\\com\\itheima\\myiotest5\\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);


    }

    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();
    }

    private static void writeFile(String pathFile, String str, boolean isAppend) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter(pathFile, isAppend));
        bw.write(str);
        bw.newLine();
        bw.close();
    }


    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;
    }
}

2.2 练习:随机点名器5

  对应视频为:IO流-51-综合练习07-带权重的随机算法,不理解的地方请在视频中直接听,比纯看博客好理解得多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 权重占比的思考
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
      Student
package com.itheima.myiotest6;

public class Student {
    private String name;
    private String gender;
    private int age;
    private double weight;


    public Student() {
    }

    public Student(String name, String gender, int age, double weight) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.weight = weight;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return gender
     */
    public String getGender() {
        return gender;
    }

    /**
     * 设置
     *
     * @param gender
     */
    public void setGender(String gender) {
        this.gender = gender;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     *
     * @return weight
     */
    public double getWeight() {
        return weight;
    }

    /**
     * 设置
     *
     * @param weight
     */
    public void setWeight(double weight) {
        this.weight = weight;
    }

    public String toString() {
        return name + "-" + gender + "-" + age + "-" + weight;
    }
}

  Test

package com.itheima.myiotest6;

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

public class Test {
    public static void main(String[] args) throws IOException {
        //1.把文件中所有的学生信息读取到内存中
        ArrayList<Student> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new FileReader("myiotest\\src\\com\\itheima\\myiotest6\\names.txt"));
        String line;
        while((line = br.readLine()) != null){
            String[] arr = line.split("-");
            Student stu = new Student(arr[0],arr[1],Integer.parseInt(arr[2]),Double.parseDouble(arr[3]));
            list.add(stu);
        }
        br.close();

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

        //3.计算每一个人的实际占比
        //[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
        double[] arr = new double[list.size()];
        int index = 0;
        for (Student stu : list) {
            arr[index] = stu.getWeight() / weight;
            index++;
        }

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

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

        //6.修改当前学生的权重
        double w = stu.getWeight() / 2;
        stu.setWeight(w);

       //7.把集合中的数据再次写到文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("myiotest\\src\\com\\itheima\\myiotest6\\names.txt"));
        for (Student s : list) {
            bw.write(s.toString());
            bw.newLine();
        }
        bw.close();


    }
}

  运行结果 - 读取学生信息
在这里插入图片描述
  运行结果 - 数据处理,作为学生对象添加到集合中

在这里插入图片描述
  运行结果 - 计算权重的总和
在这里插入图片描述
  运行结果 - 计算每一个人的实际占比
在这里插入图片描述
  运行结果 - 计算每一个人的权重占比范围
在这里插入图片描述
  运行结果 - 第一次随机抽取索引,使用二分查找法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  运行结果 - 第一次随机抽取到的同学
在这里插入图片描述
  运行结果 - 第一次随机抽取到的同学后,需要修改对应的权重
在这里插入图片描述
在这里插入图片描述
  运行结果 - 多次随机抽取到的同学后,且修改完对应的权重后,再将数据写入文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.登录注册

  注:对应视频为:IO流-52-综合练习08-登录注册IO流-53-综合练习09-拼图游戏 (导入项目)IO流-54-综合练习10-拼图游戏 (登录界面)IO流-55-综合练习11-拼图游戏 (注册界面)
在这里插入图片描述

3.1 练习:登录注册1

  对应视频为:IO流-52-综合练习08-登录注册,不理解的地方请在视频中直接听,比纯看博客好理解得多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  准备好的文件。
在这里插入图片描述
在这里插入图片描述
  Test

package com.itheima.myiotest7;


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("myiotest\\src\\com\\itheima\\myiotest7\\userinfo.txt"));
        String line = br.readLine();//username=zhangsan&password=123
        br.close();
        String[] userInfo = line.split("&");
        String[] arr1 = userInfo[0].split("=");
        String[] arr2 = userInfo[1].split("=");

        String rightUsername = arr1[1];
        String rightPassword = arr2[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) && rightPassword.equals(password)){
            System.out.println("登陆成功");
        }else{
            System.out.println("登陆失败");
        }


    }
}

  运行结果 - 读取文件里的数据
在这里插入图片描述
  运行结果 - 读取正确的用户名和密码
在这里插入图片描述
  运行结果 - 用户键盘录入用户名和密码,然后比较文件中的用户信息和键盘输入的是否一致
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 练习:登录注册2(需独立完成)

在这里插入图片描述
  Test

package com.itheima.myiotest8;


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

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

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

        */

        //1.读取正确的用户名和密码
        BufferedReader br = new BufferedReader(new FileReader("myiotest\\src\\com\\itheima\\myiotest8\\userinfo.txt"));
        String line = br.readLine();//username=zhangsan&password=123&count=0
        br.close();
        String[] userInfo = line.split("&");
        String[] arr1 = userInfo[0].split("=");
        String[] arr2 = userInfo[1].split("=");
        String[] arr3 = userInfo[2].split("=");

        String rightUsername = arr1[1];
        String rightPassword = arr2[1];
        //count:表示用户连续输错的次数
        int count = 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) && rightPassword.equals(password) && count < 3) {
            System.out.println("登陆成功");
            writeInfo("username=" + rightUsername + "&password=" + rightPassword + "&count=0");
        } else {
            count++;
            if (count < 3) {
                System.out.println("登陆失败,还剩下" + (3 - count) + "次机会");
            } else {
                System.out.println("用户账户被锁定");
            }

            writeInfo("username=" + rightUsername + "&password=" + rightPassword + "&count=" + count);
        }
    }

    /*
    * 作用:
    *       写出一个字符串到本地文件中
    * 参数:
    *       要写出的字符串
    * */
    public static void writeInfo(String content) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("myiotest\\src\\com\\itheima\\myiotest8\\userinfo.txt"));
        bw.write(content);
        bw.close();
    }
}

3.3 练习:登录注册3

  对应视频为:IO流-53-综合练习09-拼图游戏 (导入项目)IO流-54-综合练习10-拼图游戏 (登录界面)IO流-55-综合练习11-拼图游戏 (注册界面),需要的自己看视频。笔记里就不记全了,反正忘得快。
在这里插入图片描述
  登录。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  注册。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 练习:登录注册4(需独立完成)

在这里插入图片描述
在这里插入图片描述

4.游戏存档和读档

  注:对应视频为:IO流-56-综合练习12-拼图游戏 (存档)IO流-56-综合练习13-拼图游戏 (读档)IO流-56-综合练习13-拼图游戏 (数据同步)
在这里插入图片描述

3.1 练习:游戏存档

  对应视频为:IO流-56-综合练习12-拼图游戏 (存档),需要的自己看视频。笔记里就不记全了,反正忘得快。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

3.2 练习:游戏读档

  对应视频为:IO流-56-综合练习13-拼图游戏 (读档),需要的自己看视频。笔记里就不记全了,反正忘得快。

3.3 练习:数据同步

  对应视频为:IO流-56-综合练习13-拼图游戏 (数据同步),需要的自己看视频。笔记里就不记全了,反正忘得快。

5.游戏配置

  注:对应视频为:IO流-57-综合练习15-properties的基本使用IO流-58-综合练习16-拼图游戏 (配置文件)
在这里插入图片描述

5.1 properties的基本使用

  对应视频为:IO流-57-综合练习15-properties的基本使用,需要的自己看视频。

5.1.1 什么是配置文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.1.2 配置文件的好处

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.1.3 常见的配置文件

在这里插入图片描述

5.1.4 properties配置文件

在这里插入图片描述

在这里插入图片描述

5.1.5 练习:Properties作为Map集合的操作

  Test1

package com.itheima.myiotest9;

import java.util.Properties;

public class Test1 {
    public static void main(String[] args) {
         /*

              Properties作为Map集合的操作

        */


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

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

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

       /* 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);
        }*/

    }
}

  没有指定泛型。
在这里插入图片描述
在这里插入图片描述
  运行结果 - Properties结合的键是不会重复的,是唯一的
在这里插入图片描述
  运行结果 - 打印Properties集合
在这里插入图片描述
  运行结果 - 遍历Properties集合
在这里插入图片描述
在这里插入图片描述

5.1.6 练习:Properties跟IO流结合的操作

  Test2

package com.itheima.myiotest9;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

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("bbb","ccc");
        prop.put("ddd","eee");
        prop.put("fff","iii");

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


        /*BufferedWriter bw = new BufferedWriter(new FileWriter("myiotest\\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();*/




    }
}

  运行结果 - 把集合中的数据以键值对的形式写到本地文件当中,使用之前的方式,非常麻烦

在这里插入图片描述
  运行结果 - 把集合中的数据以键值对的形式写到本地文件当中,使用Properties的特有方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.1.7 练习:读取本地Properties文件里面的数据

  Test3

package com.itheima.myiotest9;

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

public class Test3 {
    public static void main(String[] args) throws IOException {
        //1.创建集合
        Properties prop = new Properties();
        //2.读取本地Properties文件里面的数据
        FileInputStream fis = new FileInputStream("myiotest\\a.properties");
        prop.load(fis);
        fis.close();

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

  运行结果 - 读取本地Properties文件里面的数据
在这里插入图片描述
在这里插入图片描述

5.2 练习:游戏配置

  对应视频为:IO流-58-综合练习16-拼图游戏 (配置文件),需要的自己看视频。笔记里就不记全了,反正忘得快。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.每日一记

  注:对应视频为:IO流-59-综合练习17-每日一记 (阶段大作业),需要的自己看视频。笔记里就不记全了,反正忘得快。

在这里插入图片描述

6.1 练习1:课后作业

在这里插入图片描述
  添加
在这里插入图片描述
在这里插入图片描述
  修改
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
  修删除

在这里插入图片描述

6.1 练习2:导出和导入的功能 - 基于练习1的课后作业

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  好,本次笔记到此结束。

页末

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel的文件导入遇到大文件时

Excel的文件导入向导如何把已导入数据排除 入起始行&#xff0c;选择从哪一行开始导入。 比如&#xff0c;前两行已经导入了&#xff0c;第二次导入的时候排除前两行&#xff0c;从第三行开始&#xff0c;就将导入起始行设置为3即可&#xff0c;且不勾选含标题行。 但遇到大文…

qemu安装arm64架构银河麒麟

qemu虚拟化软件&#xff0c;可以在一个平台上模拟另一个硬件平台&#xff0c;可以支持多种处理器架构。 一、安装 安装教程&#xff1a;https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接&#xff1a;https://qemu.weilnetz.de/w64/2024/ 我下载的是 …

Linux-ubuntu环境配置

一&#xff0c;安装VWware&#xff0c;里面导入镜像文件 这些都是文件夹里面有的&#xff0c;然后对着正点原子视频安装就行&#xff0c;虚拟机的破解码&#xff0c;去百度搜一个能用就行&#xff0c;中间遇见俩问题。①乌班图里面不能上网&#xff0c;②插入U盘后&#xff0c;…

如何在 Ubuntu 22.04 上安装和使用 Apache Kafka

简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka&#xff0c;让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程&#xff0c;你将学会如…

TCP/IP杂记

TCP三次握手、四次挥手 从应用角度&#xff0c;不用多考虑为什么有三次&#xff0c;遵循标准即可。 ubuntu 下 wireshark安装&#xff1a; sudo add-apt-repository universe sudo apt install wireshark 三次握手实证&#xff1a; 第一次握手的情况如下&#xff1a;&#…

【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)

1. 什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;使开发者能快速上手。 2. 为什么…

MTK Android12 开机向导

文章目录 需求-场景参考资料&#xff1a;博客资料官网参考资料&#xff1a;参考资料注意点 附件资料文件说明&#xff1a;推荐工具&#xff1a;配置定制的 声明叠加层 APK需求实现替换字符、删减开机向导界面、添加开机向导界面删除部分界面需求&#xff0c;官网说明如下更新部…

思科模拟器路由器的基本配置

一、实验目的 了解路由器的作用掌握路由器的基本配置方法 3、掌握路由器模块的使用和互连方式 二、实验环境 2811路由器一台&#xff0c;计算机两台&#xff0c;Console配置线一根&#xff0c;网线若干&#xff1b;本实验拓扑图如图8-1所示&#xff1b;计算机IP地址规划如表8-…

HTTP multipart/form-data 请求

序言 最近在写项目的过程中有一个需求是利用 HTTP 协议传输图片和视频&#xff0c;经过查询方法相应的方法发现使用 multipart/form-data 的方式&#xff0c;这是最常见处理二进制文件的表单编码类型。  学习了一下午&#xff0c;现在总结一下使用的方法和相关的知识点&#x…

一、测试工具LoadRunner Professional脚本编写-录制前设置

设置基于URL的脚本 原因:基于HTML的脚本会导致login接口不能正确录制 设置UTF-8 原因:不勾选此项会导致脚本中文变为乱码

Hadoop生态圈框架部署(九-2)- Hive HA(高可用)部署

文章目录 前言一、Hive部署&#xff08;手动部署&#xff09;下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决冲突2.3.1 解决guava冲突2.3.2 解决SLF4J冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在M…

JAVA |日常开发中Websocket详解

JAVA &#xff5c;日常开发中Websocket详解 前言一、Websocket 概述1.1 定义1.2 优势 二、Websocket 协议基础2.1 握手过程2.2 消息格式2.3 数据传输方式 三、Java 中使用 Websocket3.1 Java WebSocket API&#xff08;JSR - 356&#xff09;3.2 第三方库&#xff08;如 Tyrus&…

算法基础学习Day6(动态窗口)

文章目录 1.题目2.题目解答1.最大连续1的个数题目及题目解析算法学习思路一:暴力解法思路二:滑动窗口 代码提交 2.将x减到0的最小操作数题目及题目解析算法学习滑动窗口解决问题 代码提交 1.题目 1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09;1658. 将 x…

开发一套SDK 第一弹

自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…

【leetcode】替换后的最长重复字符、将字符串翻转到单调递增

1.替换后的最长重复字符 示例如下&#xff1a; 下面我们来分析一下一个例子&#xff0c;其中K 2 暴力枚举 这里的字符串s是仅由大写字母组成&#xff0c;首先我们尝试用暴力解法的思路来想一下这道题&#xff0c;通过从第一个字符开始进行枚举&#xff0c;如果出现了条件判断…

HarmonyOS 线性容器List 常用的几个方法

List底层通过单向链表实现&#xff0c;每个节点有一个指向后一个元素的引用。当需要查询元素时&#xff0c;必须从头遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。List允许元素为null。 List和LinkedList相比&#xff0c;LinkedList是双向链表&#xff0c;可以快速…

C# 网络编程--基础核心内容

在现今软件开发中&#xff0c;网络编程是非常重要的一部分&#xff0c;本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌&#xff1a; : 上图引用大佬的图&#xff0c;大家也关注一下&#xff0c;有技术有品质&#xff0c;有国有家&#xff0c;情…

基于Python实现web网页内容爬取

文章目录 1. 网页分析2. 获取网页信息2.1 使用默认的urllib.request库2.2 使用requests库1.3 urllib.request 和 requests库区别 2. 更改用户代理3. BeautifulSoup库筛选数据3.1 soup.find()和soup.find_all() 函数 4. 抓取分页链接参考资料 在日常学习和工作中&#xff0c;我们…

ASP .NET Core 中的环境变量

在本文中&#xff0c;我们将通过组织一场小型音乐会&#xff08;当然是在代码中&#xff09;来了解 ASP .NET Core 中的环境变量。让我们从创建项目开始&#xff1a; dotnet new web --name Concert 并更新Program.cs&#xff1a; // replace this: app.MapGet("/"…

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…