自学内容网 自学内容网

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


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

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

0 目录

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


-------------------------------------------------------------------------------------



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

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

1. 制造假数据

  注:对应视频为:1O流-45-综合练习01-网络爬虫(爬取姓氏)IO流-46-综合练习02-网络爬虫(爬取名字)、、、、、、、、、、、。

1.1 如何制造假数据

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

1.2 练习:爬取姓氏、男生名字、女生名字

  对应视频为:1O流-45-综合练习01-网络爬虫(爬取姓氏)IO流-46-综合练习02-网络爬虫(爬取名字),不理解的地方请在视频中直接听,比纯看博客好理解得多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  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();
    }
}

  运行结果 - 爬取姓氏网址后获取的网页源码
在这里插入图片描述
  运行结果 - 爬取男生名字网址后获取的网页源码
在这里插入图片描述
  运行结果 - 根据姓氏的网页源码获取姓氏,使用正则表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  然后,为了得到男生名字,我们需要在网页中观察数据。
在这里插入图片描述
  运行结果 - 根据男生名字的网页源码获取男生名字,使用正则表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  运行结果 - 根据女生名字的网页源码获取女生名字,使用正则表达式
在这里插入图片描述
在这里插入图片描述


  好,本次笔记到此结束。

页末


原文地址:https://blog.csdn.net/m0_60146935/article/details/144317764

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!