前言
感觉自己给个智障似的,(lll¬ω¬)
几年了,才想起来自己写个程序去干这事
淦
写一个字符串对比的程序
将青年大学习中copy出来的已观看人员名单与班级全部人员名单进行对比
最后输出为观看人员的名单。
1.将班级全部人员名单和已观看人员名单放进俩个数组中
2.对比,在班级全部人员名单的数组中删除所有的已观看人员名单
3.遍历输出剩余的人员
代码演示
compare1
所谓的未看人员名单,其实归根结底就是两个字符串数组的比较,然后输出小数组没有的元素:
/**
* 两个字符串数组
* 在主数组的基础上删除小数组的元素
* 之后输出剩余的元素
* @author Wildmess
* @Date 2020.11.5
*/
public class compare1 {
public static void main(String[] args) {
//全班名单数组
String[] allStr = {"一","三","五","二","四"};
//已经看完的人员名单数组
String[] haveStr = {"二","五","四"};
//未看完的人员名单数组
String[] noStr = allStr;
boolean flag=true;
int count = 0;
for (int i = 0; i < allStr.length; i++) {
for (int j = 0; j < haveStr.length; j++) {
if(allStr[i].equals(haveStr[j])) {
flag = false;
System.out.println(allStr[i]+"," +haveStr[j]);
}
}
if(flag) {
noStr[count++] = allStr[i];
}
}
for(int i=0;i<count;i++) {
System.out.println(noStr[i]);
}
}
}
compare2
进行改进,让两个数组可以从文件中读取到响应的数据,并将字符串的比较包装成一个静态方法(主要是想后来写一个GUI界面,有机会的话):
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.Arrays;
/**
* 在compare1的基础上增加读取文件的功能,
* 从全班名单中读取出mainStr
* 从已经看完的人员名单中读取出haveStr
* 并将字符串的比较包装成一个静态方法
* @author Wildmess
* @Date 2020.11.5
*/
public class compare2 {
static int count;
public static String[] read(File file) {
count=0;
String[] str = new String[100];
try {
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"gbk");
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine())!=null) {
str[count++] = line;
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
str = Arrays.copyOf(str, count);
return str;
}
public static String[] compare(String[] allStr, String[] haveStr) {
boolean flag=true;
count = 0;
String[] str = new String[100];
for (int i = 0; i < allStr.length; i++) {
flag=true;
for (int j = 0; j < haveStr.length; j++) {
if(allStr[i].equals(haveStr[j])) {
flag = false;
}
}
if(flag) {
str[count++] = allStr[i];
}
}
str = Arrays.copyOf(str, count);
return str;
}
public static void main(String[] args) {
//全班名单数组
String[] allStr = null;
File allFile = new File("全班名单.txt");
allStr = read(allFile);
//已经看完的人员名单数组
String[] haveStr = null;
File haveFile = new File("已看完名单.txt");
haveStr = read(haveFile);
//未看完的人员名单数组
String[] noStr = null;
noStr = compare(allStr,haveStr);
System.out.println(Arrays.toString(noStr));
// for(int i=0;i<count;i++) {
// System.out.println(noStr[i]);
// }
}
}
compare3
compare2基本完成了要求的功能,但是,如果直接将微信后台已看完的内容复制粘贴出现的其中一行数据具体为:姓名 观看时间, 还需要进行一定的修改,麻烦
故需要继续改进
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.Arrays;
/**
* compare2基本完成了要求的功能
* 但是
* 如果直接将微信后台已看完的内容复制粘贴
* 出现的其中一行数据具体为:姓名 观看时间
* 还需要进行一定的修改,麻烦
* 需要继续改进
* @author Wildmess
*
*/
public class compare3 {
static int count;
public static String[] read(File file) {
count=0;
String[] str = new String[100];
try {
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"gbk");
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine())!=null) {
String[] msg = line.split(" ");
line = msg[0]; //只要前面的名字,后面舍去
//System.out.println(msg[0]);
str[count++] = line;
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
str = Arrays.copyOf(str, count);
//System.out.println(Arrays.toString(str));
return str;
}
public static String[] compare(String[] allStr, String[] haveStr) {
boolean flag=true;
count = 0;
String[] str = new String[100];
for (int i = 0; i < allStr.length; i++) {
flag=true;
for (int j = 0; j < haveStr.length; j++) {
if(allStr[i].equals(haveStr[j])) {
flag = false;
}
}
if(flag) {
str[count++] = allStr[i];
}
}
str = Arrays.copyOf(str, count);
return str;
}
public static void main(String[] args) {
//全班名单数组
String[] allStr = null;
File allFile = new File("全班名单.txt");
allStr = read(allFile);
//已经看完的人员名单数组
String[] haveStr = null;
File haveFile = new File("已看完名单.txt");
haveStr = read(haveFile);
//未看完的人员名单数组
String[] noStr = null;
noStr = compare(allStr,haveStr);
// System.out.println(Arrays.toString(noStr));
System.out.println("青年大学习后台查询无果的:");
for(int i=0;i<count;i++) {
System.out.println(noStr[i]);
}
}
}
文件目录
全班名单中的数据排列为一行一个名字,已看完名单中的数据为直接复制查询结果中的数据,大概就是一个名字+空格+观看日期,具体的情况如图片所示:
这也是为什么有compare3的原因。
后记
本来还想写个GUI界面,打包成.exe文件,或者一键进入微信后台去查出对应结果,不过碍于某些原因估计要拖到后面进行了,反正暂时写好的代码基本上已经满足了正常情况下个人的需要了。
2020.11.28
最近发现可以直接输网址,然后只需输入一次验证码就可以进去看班级已看完的人员名单,我查询时具体规则如下:
http://wxtp.hefei.cc/zt2020/tuanzhishum季数_期数(特辑为季数_期数_1(2))/rank_t.php?type=detail&typename=直属高校&typename1=学校名&typename2=学院名&typename3=班级名
2020.12.6
Compare4(加了一个查询重复观看人物的功能)
发现有人会多刷几次,原因未知,但有时需要查询对应重复观看人数,加入修改程序为Compare4:
public class Compare4 {
static int count;
public static String[] read(File file) {
count=0;
String[] str = new String[100];
try {
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"gbk");
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine())!=null) {
String[] msg = line.split(" ");
line = msg[0]; //只要前面的名字,后面舍去
//System.out.println(msg[0]);
str[count++] = line;
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
str = Arrays.copyOf(str, count);
//System.out.println(Arrays.toString(str));
return str;
}
public static String[] compare(String[] allStr, String[] haveStr) {
boolean flag=true;
count = 0;
String[] str = new String[100];
for (int i = 0; i < allStr.length; i++) {
flag=true;
for (int j = 0; j < haveStr.length; j++) {
if(allStr[i].equals(haveStr[j])) {
flag = false;
}
}
if(flag) {
str[count++] = allStr[i];
}
}
str = Arrays.copyOf(str, count);
return str;
}
/**
* 查看是谁看多了
* @param args
*/
public static void CheckCopy(String[] str) {
String[] a= new String[str.length];
int b=0;
for(int i=0;i<str.length;i++) {
a[i]=str[i];
for(int j=0;j<a.length;j++) {
if(str[i].equals(a[j])) {
b++;
}
}
if(b!=1) {
System.out.println(str[i]+"看了" + b+"次");
}
b=0;
}
}
public static void main(String[] args) {
//全班名单数组
String[] allStr = null;
File allFile = new File("全班名单.txt");
allStr = read(allFile);
//已经看完的人员名单数组
String[] haveStr = null;
File haveFile = new File("已看完名单.txt");
haveStr = read(haveFile);
//未看完的人员名单数组
String[] noStr = null;
noStr = compare(allStr,haveStr);
/*
* 输出没看的人的名单
*/
// System.out.println(Arrays.toString(noStr));
System.out.println("青年大学习后台查询无果的:");
for(int i=0;i<count;i++) {
System.out.println(i+1 + "."+noStr[i]);
}
System.out.println("共有" + count +"人没有完成观看学习!");
/*查看是谁多看了*/
if((haveStr.length+count)>allStr.length) {
/*
* 出现重复看的就表示
* 已看完的+未看完的>全班总人数
*/
System.out.println("\n\n\n并且在后台中:");
CheckCopy(haveStr);
}
}
}
2021.1.11
烦人,这域名改的也太勤了吧,最近使用的是网址是:
http://dxx.ahyouth.org.cn/zt2020/后面同上。
另外,应该是服务器的原因吧,好多人在后台查询时显示观看了数次,尽我自己就看了8次,(lll¬ω¬)
不过倒是暴露了一些上回写的关于查询重复观看的人名及次数的问题,另外为了试试新学习的技术map,修改CheckCopy方法如下:
public static void CheckCopy(String[] str) {
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i=0; i<str.length; i++) {
//将已看完的人当作map的key值,看过的次数定为values值
if( map.containsKey(str[i]) ) {
int oldValue = map.get(str[i]);
map.replace(str[i], oldValue, oldValue+1);
} else {
map.put(str[i], 1);
}
}
//将最终生成的map数据放到一个集合中
List<Entry<String,Integer>> list = new ArrayList<Entry<String,Integer>>();
list.addAll(map.entrySet());
//迭代遍历集合,输出需要的信息
for(Entry<String,Integer> e : list) {
if(e.getValue()>1) {
System.out.println(e.getKey() + "看了" + e.getValue() +"次");
}
}
}
使用修改后的方法重复输出相关语句得到修改,完毕。
感觉好像前面的代码用map写相关的东西好像更容易,有时间可以尝试。