IO流综合练习

news2024/11/12 16:56:34

IO流综合练习

文章目录

  • IO流综合练习
    • 制造假数据
      • 需求
      • 利用糊涂包制造假数据,并写入文件中
    • 随机点名器
      • Student标准JavaBean类
      • 实现代码
      • names.txt文件中的内容
    • 登录

制造假数据

需求

制造假数据也是开发中的一个能力,在各个网上爬取数据,是其中一个方法

在这里插入图片描述

package com.example.demo.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.*;
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 = getDate(familyNameStr,"([\\u4E00-\\u9FA5]{4})(,|。)",1);
        ArrayList<String> boyNameTempList = getDate(boyNameStr,"([\\u4E00-\\u9FA5]{2})(、|。)",1);
        ArrayList<String> girlNameTempList = getDate(girlNameStr,"(.. ){4}..",0);

//        4.处理数据
//        familyNameTempList(姓氏)
//        处理方案:把每一个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyNameList = new ArrayList<>();
        for (String str : familyNameTempList) {
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                familyNameList.add(c+"");
            }
        }

        //boyNameTempList
        //处理方案:去除其中的重复数据

        ArrayList<String> boyList = new ArrayList<>();
        for (String str : boyNameTempList) {
            if(!boyList.contains(str)){
                boyList.add(str);
            }
        }

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

//        5.生成数据
        ArrayList<String> list = getInfos(familyNameList,boyList,girlList,70,80);
        Collections.shuffle(list);
        System.out.println(list);

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

    }

    /*
    * 作用:
    *       获取男生和女生的信息:姓名(唯一)-性别-年龄
    * 形参:
    *       参数一:装着姓氏的集合
    *       参数二:装着男生名字的集合
    *       参数三:装着女生名字的集合
    *       参数四:男生的个数
    *       参数五:女生的个数
    * */
    public static ArrayList<String> getInfos(ArrayList<String> familyNameList,ArrayList<String> boyList,ArrayList<String> girlList,int boyCount,int girlCount){
//        1.生成男生不重复的名字
        HashSet<String> boyhs = new HashSet<>();
        while (true){
            if(boyhs.size() == boyCount){
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(boyList);
            boyhs.add(familyNameList.get(0)+boyList.get(0));
        }

//        2.生成女生不重复的名字
        HashSet<String> girlhs = new HashSet<>();
        while (true){
            if(girlhs.size() == girlCount){
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(girlList);
            girlhs.add(familyNameList.get(0)+girlList.get(0));
        }

        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        for (String boyName:boyhs){
            int age = r.nextInt(10)+18;
            list.add(boyName+"-男-"+ age);
        }

//        4.生成女生的信息并添加到集合当中
        for (String girlName:girlhs){
            int age = r.nextInt(8)+18;
            list.add(girlName+"-女-"+ age);
        }
        return list;
    }

    /*
    * 作用:根据正则表达式获取字符串中的数据
    *参数一:
    *       完整的字符串
    * 参数二:
    *       正则表达式
    * 参数三:
    *
    * 返回值:
    *       真正想要的数据
    *
    * */
    private static ArrayList getDate(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();
    }

}

利用糊涂包制造假数据,并写入文件中

在这里插入图片描述

//Maven项目中
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.29</version>
</dependency>
//Gradle
 implementation'cn.hutool:hutool-all:5.8.29'
package com.example.demo.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("([\\u4E00-\\u9FA5]{4})(,|。)", familyNameStr, 1);
        List<String> boyNameTempList = ReUtil.findAll("([\\u4E00-\\u9FA5]{2})(、|。)", boyNameStr, 1);
        List<String> girlNameTempList = ReUtil.findAll("(.. ){4}..", girlNameStr, 0);

        //4.处理数据
        ArrayList<String> familyNameList = new ArrayList<>();
        for (String str : familyNameTempList) {
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                familyNameList.add(c+"");
            }
        }

        //boyNameTempList
        //处理方案:去除其中的重复数据
        ArrayList<String> boyList = new ArrayList<>();
        for (String str : boyNameTempList) {
            if(!boyList.contains(str)){
                boyList.add(str);
            }
        }

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

        //5.生成数据
        ArrayList<String> list = getInfos(familyNameList,boyList,girlList,70,80);
        Collections.shuffle(list);
        System.out.println(list);

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

    /*
     * 作用:
     *       获取男生和女生的信息:姓名(唯一)-性别-年龄
     * 形参:
     *       参数一:装着姓氏的集合
     *       参数二:装着男生名字的集合
     *       参数三:装着女生名字的集合
     *       参数四:男生的个数
     *       参数五:女生的个数
     * */
    public static ArrayList<String> getInfos(ArrayList<String> familyNameList,ArrayList<String> boyList,ArrayList<String> girlList,int boyCount,int girlCount){
//        1.生成男生不重复的名字
        HashSet<String> boyhs = new HashSet<>();
        while (true){
            if(boyhs.size() == boyCount){
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(boyList);
            boyhs.add(familyNameList.get(0)+boyList.get(0));
        }

//        2.生成女生不重复的名字
        HashSet<String> girlhs = new HashSet<>();
        while (true){
            if(girlhs.size() == girlCount){
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(girlList);
            girlhs.add(familyNameList.get(0)+girlList.get(0));
        }

        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        for (String boyName:boyhs){
            int age = r.nextInt(10)+18;
            list.add(boyName+"-男-"+ age);
        }

//        4.生成女生的信息并添加到集合当中
        for (String girlName:girlhs){
            int age = r.nextInt(8)+18;
            list.add(girlName+"-女-"+ age);
        }
        return list;
    }
}

随机点名器

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

Student标准JavaBean类

package com.example.demo.myiotest5;

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

    public Student() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

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

实现代码

package com.example.demo.myiotest5;

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("demo5\\src\\main\\java\\com\\example\\demo\\myiotest2\\names.txt"));
        String line;
        while ((line = br.readLine()) != null){
            String[] arr = line.split("-");
            Student student = new Student(arr[0],arr[1],Integer.parseInt(arr[2]),Double.parseDouble(arr[3]));
            list.add(student);
        }
        br.close();

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

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

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

        //5.随机抽取
//        获取一个0.0到1.0之间的随机数
        double number = Math.random();
//        判断number在arr中的位置
//        二分查找法
//        方法返回:-插入点-1

//        获取number这个数据在数组当中的插入点位置
//        插入点 = -结果 - 1;
        int result = -Arrays.binarySearch(arr, number)-1;
        Student student = list.get(result);
        System.out.println(student);

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

        //7.把集合中的数据再次写到文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("demo5\\src\\main\\java\\com\\example\\demo\\myiotest2\\names.txt"));
        for (Student student1 : list) {
            bw.write(student1.toString());
            bw.newLine();
        }
        bw.close();
    }
}

names.txt文件中的内容

在这里插入图片描述

登录

在这里插入图片描述

package com.example.demo.myiotest3;

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 {
//        1.读取正确的的用户名和密码
        BufferedReader br = new BufferedReader(new FileReader("demo5\\src\\main\\java\\com\\example\\demo\\myiotest3\\userinfor.txt"));
        String line = br.readLine();
        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("登录失败");
        }
    }
}

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

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

相关文章

js动画插件-vue

分享一个动画插件 学习 动画插件 是进入大厂的必备技能 首先我们需要先学会 去使用js 动画 封装好的 GreenSock 动画平台 &#xff08;GSAP&#xff09; greensock.com/gsap/ 就是这个插件 我现在分享一个用例 其实很简单 但是 具体的属性 和很多 内容需要慢慢使用 慢慢看…

java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象

有面试题&#xff0c;有synchronized锁&#xff0c;threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作&#xff0c;手动释放锁&#xff0c;显式地获取锁&#xff08;属…

震惊,刷新我的认知,医疗信息数据库sqlserver中计算年龄的sql函数写了200行...

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” sqlserver中年龄计算,HIS系统中年龄计算函数 呈现的结果要求: 1周岁内显示"几月几天",1周岁以上显示"几岁" CREATE FUNCTION dbo.FUN_GETBRNL( birth varchar(…

汇昌联信拼多多电商有哪些热门话题?

随着互联网技术的飞速发展&#xff0c;电子商务已经成为人们日常生活的一部分。作为中国领先的电商平台之一&#xff0c;拼多多凭借其独特的商业模式和营销策略迅速崛起&#xff0c;吸引了大量消费者的关注。那么&#xff0c;在汇昌联信拼多多电商领域&#xff0c;有哪些热门话…

SpringBoot启动原理详解(二)

透彻理解SpringBoot启动原理&#xff08;二&#xff09; 照旧一张Spring启动顺序图我们对Spring启动原理有多少理解呢&#xff08;问题回顾&#xff09;关于Spring启动原理的若干问题1.init-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序。2.Spring 何时装配A…

【C语言】数组栈的实现

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#…

在图神经网络(GNN)上进行关系推理的新架构

开发能够学习推理的模型是一个众所周知的具有挑战性的问题&#xff0c;在这个领域中&#xff0c;使用图神经网络&#xff08;GNNs&#xff09;似乎是一个自然的选择。然而&#xff0c;以往关于使用GNNs进行推理的工作表明&#xff0c;当这些模型面对需要比训练时更长推理链的测…

听见未来,AI+Audio|2025中国国际音频产业大会(GAS)

随着AI技术的创新与突破&#xff0c; 音频行业正步入前所未有的黄金发展期。 2025中国国际音频产业大会&#xff0c; “AI对行业发展的影响” 将成为讨论的热点之一。 3月26-27日&#xff0c;2025中国国际音频产业大会&#xff08;GAS&#xff09;将在上海 张江科学会堂召…

Conda和Pip有什么区别?

conda和pip是Python中两种常用的包管理工具&#xff0c;它们在用途、包来源以及环境管理等方面存在区别。以下是具体分析&#xff1a; 用途 conda&#xff1a;conda是Anaconda发行版中的包管理工具&#xff0c;可以管理包括非Python软件包在内的各种包。它是一个全面的环境管理…

【iOS】GCD

参考文章&#xff1a;GCD函数和队列原理探索 之前写项目的时候&#xff0c;进行耗时的网络请求使用GCD处理过异步请求&#xff0c;但对一些概念都很模糊&#xff0c;这次就来系统学习一下GCD相关 相关概念 什么是GCD&#xff1f; Grand Center Dispatch简称GCD&#xff0c;是…

python-docx 如何将列表中的值提取到段落中的run以及保存为多个文档?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

使用pfld模型进行表盘读数检测

目录 1. 下载项目和数据集2. 配置环境3. 训练和测试3.1 训练3.2 测试 4. 参考 使用pfld模型对压力表进行读表检测 1. 下载项目和数据集 下载项目&#xff1a; git clone https://github.com/zhouayi/pfld.git下载数据集&#xff1a; wget https://github.com/zhouayi/pfld/r…

Vue3扁平化Tree组件的前端分页实现

大家好&#xff0c;我是小卷。得益于JuanTree的扁平化设计&#xff0c;在数据量很大的情况下除了懒加载&#xff0c;使用前端分页也是一种解决渲染性能问题的可选方案。 用法 要实现的文档&#xff1a; 分页效果&#xff1a; 实现 新增属性&#xff1a; 组件setup方法中新增…

java 对象模型的个人理解

文章目录 一、OOP-KCLASS 模型二、疑惑2.1 为什么还需要一个 Class对象&#xff1f;2.2 new 关键字和 Class.newInstance() 的区别&#xff1f; 一、OOP-KCLASS 模型 java 采用了field和method分离的方式&#xff0c;field组成实例 obj &#xff0c;存储在堆区&#xff0c;而m…

web小项目-曼波生日录(Servlet+JSP+MySQL)

效果演示&#xff1a; 当记录条数过多时会自动出现滚轮&#xff0c;数据不会超出紫框 数据库实时记录&#xff1a; 项目源代码以及所用到的资源&#xff1a; 链接: https://pan.baidu.com/s/1w0czmH9xBfetk7CZ7RNbtQ?pwd6666 提取码: 6666 复制这段内容后打开百度网盘手机App…

【数据结构】堆,优先级队列

目录 堆堆的性质大根堆的模拟实现接口实现构造方法建堆入堆判满删除判空获取堆顶元素 Java中的PriorityQueue实现的接口构造方法常用方法PriorityQueue注意事项 练习 堆 如果有一个集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的…

Listen(sockfd,backlog)监听函数的第二个参数到底是什么?深度解释

listen队列剖析 int listen(int sockfd,int backlog) backlog : 监听套接字队列 对于一个调用监听的套接字&#xff0c;系统会维护给这个套接字两个队列 1. 未完成连接队列 //当客户端发生三次握手的第一次syn包给服务器的时候&#xff0c;服务器就会再未完成队列中创建…

数据库处理表

首先先创建库&#xff0c;然后创建需要的这三个表 用dese表名查看 然后题目要求对表进行修改 用alter table这个语法来对表进行修改 modify为修改字段 需要修改的字段的属性类型改变为的属性 最后用descStudent查看 第二题需要创建索引 创建索引createindex索引名称 cre…

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义&#xff0c;就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用&#xff0c;例如最近比较火的阿…

C++客户端Qt开发——Qt窗口(工具栏)

2.工具栏 使用QToolBar表示工具栏对象&#xff0c;一个窗口可以有多个工具栏&#xff0c;也可以没有&#xff0c;工具栏往往也可以手动移动位置 ①设置工具栏 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<…