编写背景:

鼠年三月,国内疫情纷乱,各高校为保抓紧学习课程,纷纷开通网上授课,本校也同样。由于每次进入直播均需要在聊天栏签到一次以证诸位同学已到且聊天记录可保存,特写此程序以代人工检查还有谁未签到。

编写思路:

通过读取签到文件,将签到信息记录在一个数组中,然后再将班级所有同学姓名存入一个set集合中,循环判断同学的姓名是否出现在签到记录中,将出现的记录到另一个set集合,最后求出签到记录集合和同学姓名集合的差集即可得出未签到同学姓名

文件结构:

37Onr6.png
37Onr6.png

具体代码:

package sign;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Sign {
    public static void main(String[] args) throws IOException {
        Set<String> result = noSign();
        System.out.println(result);
    }

    public static Set<String> noSign() {
        String path = "src/sign/";
        // 大数据班
        String[] file1 = toArrayByFileReader1(path + "bigdata.txt");
        // java班
        String[] file2 = toArrayByFileReader1(path + "java.txt");
        // 签到记录
        String[] file3 = toArrayByFileReader1(path + "meeting_saved_chat.txt");

        int i = 0;
        // 结果集
        Set<String> result = new HashSet<>();
        // 名单
        Set<String> sign = new HashSet<String>();
        // 未签到
        Set<String> nosign = new HashSet<String>();
        // 遍历同学
        for (String a : file2) {
            // 将所有同学录入
            sign.add(a);
            // 遍历每行签到数据
            for (String b : file3) {
                // 截取签到记录
                String d = b.substring(b.indexOf('j') + 1);
                String c = b.substring(b.indexOf('J') + 1);
                // 判断签到记录是否包含同学姓名
                if (d.contains(a) || c.contains(a)) {
                    // 记录签到同学数量
                    i++;
                    // 将签到的同学记录在册
                    nosign.add(a);
                }
            }
        } // 查询结束

        // 清空结果集
        result.clear();
        // 将所有同学记录
        result.addAll(sign);
        // 将签到同学记录移除
        result.removeAll(nosign);
        // 输出剩余同学(未签到)
        return result;

    }

    public static String[] toArrayByFileReader1(String name) {
        // 使用ArrayList来存储每行读取到的字符串
        ArrayList<String> arrayList = new ArrayList<>();
        try {
            //这样读取以除乱码
            BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(name), "UTF-8"));
            String str;
            // 按行读取字符串
            while ((str = bf.readLine()) != null) {
                arrayList.add(str);
            }
            bf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对ArrayList中存储的字符串进行处理
        int length = arrayList.size();
        String[] array = new String[length];
        for (int i = 0; i < length; i++) {
            String s = arrayList.get(i);
            array[i] = s;
        }
        // 返回数组
        return array;
    }
}

说明:

java.txt和bigdata.txt是两个班同学的姓名,检查哪个班都可以,只需要将noSign方法中的第一个循环中的file1(大数据)改为file2(java)
meeting_saved_chat.txt文件是直播的聊天文件及签到文件,替换相应时间段的聊天文件即可检查不同的时间段签到情况

用到的知识:

文件读取(输入输出流)
set集合的求差集

遇到的问题:

文件读取的时候出现乱码 [解决方案][1]
文件读取出后第一行有个问号乱码 解决方案:
    这个问题是由于文件的编码是utf-8-bom,将文件的编码改为utf-8即可(可以利用notepad++来修改)