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

IO习题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

习题1:爬取数据制作姓名

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();
    }
}
  • 在使用正则表达式爬取数据时,需要特定的类型,但不需要其中的全部信息,就需要用到分组()

    group(index):

    ​ index为0,表示特定类型中的所有

    ​ index为1,表示特定类型中的第一组

    ​ index为2,表示特定类型中的第二组

    ​ 。。。

  • 如果需要特定的正则表达式,可以使用anyrule

习题2:带权重的随机点名器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

类为学生类,里面存储学生信息和权重

步骤:

  1. 获取权重和

  2. 获取每个数据权重占比(个人权重/权重和)

  3. 获取每个数据权重占比范围(在[0,1)中)

  4. 获取随机数据后进行插入(原数据列为从小到大,并且需要用最大的表示数值),插入的地方就是要抽取元素的位置

    如:(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0)不用最小,是因为可插入点的数目大于数据列中数据数目

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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:导入项目

导入步骤:

  1. 将需要导入的项目放入保存自己项目的文件夹
  2. 进行导入模块,选择以.iml为结尾的文件导入

习题4:数据读取位置

  1. 在登录时,读取用户信息在打开界面时读取还是点击登录时读取

    界面,因为登录失败还得读取数据,数据不会更改,所以在创建界面时读取一次就行

  2. 代码写入静态代码块中还是构造方法中?

    构造方法中,因为在项目运行时,可能发生注册,当注册时数据会发生更改,所以用静态代码块只读取一次是不行的

  3. 写项目的意义?

    学会如何选择知识点

习题5:读取点击按钮

在读档的时候有多个读档框,获取对应的档框

Object obj = e.getSource();
JMenuItem item = (JMenuItem)obj;
String str = item.getText();
int index = str.charAt(2) - '0';
  • e.getSource()获取的是源头本身,可以对obj(Object obj = e.getSource())进行操作(如:如果源头为按钮,获取的就是这个按钮本身)

字符变数字的两种方式(char ch)

  1. int a = ch - ‘0’
  2. int b = Integer.parseInt(ch+“”)

配置文件

  • 好处1:可以把软件的设置永久化存储

  • 好处2:如果我们要修改参数,不需要改动代码,直接修改配置文件就可以了

    如:广告需要进行更换时,选择配置文件更好,因为选择去修改代码还得重新打包和重新发布等

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Properties类中没有泛型,所以我们可以在Properties对象中添加任意的数据类型,但一般只会往里面添加字符串类型的数据

存入Properties文件数据

public static void main(String[] args) throws IOException, ClassNotFoundException {
	//1.创建集合
    Properties prop = new Properties();

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

	//3.存入本地Properties文件数据
	FileOutputStream fos = new FileOutputStream(".\\a.properties");
	prop.store(fos,"text");    //第二个参数为注释
	fos.close();
}
  • 文件中一般不写中文

读取Properties文件中的数据

public static void main(String[] args) throws IOException, ClassNotFoundException {
	//1.创建集合
    Properties prop = new Properties();
    
    //2.读取本地Properties文件里面的数据
    FileInputStream fis = new FileInputStream(".\\a.properties");
    prop.load(fis);
    fis.close();
    
    //3.打印集合
    System.out.println(prop);
}
  • Properties是一个Map集合不同点就是他有自己的方法存入到文件中和从文件读取集合信息
    gs) throws IOException, ClassNotFoundException {
    //1.创建集合
    Properties prop = new Properties();

    //2.读取本地Properties文件里面的数据
    FileInputStream fis = new FileInputStream(“.\a.properties”);
    prop.load(fis);
    fis.close();

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


- <b style="color: red">Properties是一个Map集合</b>,**不同点就是他有自己的方法存入到文件中和从文件读取集合信息**
  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值