该程序是为了通过学号统计打卡次数;
realsum为打卡次数---------------
思路:1.通过两个hashmap:repeat和map,repeat是用来(去重)fir;map是记录已经写入的数据且,key为学号,value为Sed类 ,在后面会将demo的数据加到map中
2.先循环读入demo的数据,数据会存放在fir的数组中,然后读入xieru的数据,数据会存放在sed数组中
3.将demo中的数据加入到xieru的数据中;其中会判断repeat(该学号)是否已经存在于map的(key)
4如果存在就直接让map(value中的realsum++);如果不存在那么将repeat的value(学号)作为key,fir【i】作为value加入到map
如果写入文件以覆盖的方式写入:在进行对(xieru)文件读写的while循环会直接跳过。这是为什么
如果写入文件以追加的方式写入:那么程序正常
问题:
如果写入文件以覆盖的方式写入:在进行对(xieru)文件读写的while循环会直接跳过。这是为什么
如果写入文件以追加的方式写入:那么程序正常
import java.io.*;
import java.util.HashMap;
//class Sed {
// public String name;//姓名
// public String no;//学号
//}
class Sed {
public String name; //姓名
public String no; //学号
public String sum;
public int realsum=0; //打卡次数
}
public class tongji {
public static void main(String[] args) throws IOException {
//创建两个hashtable;repeat记录demo的;map记录已经写入的(xieru文件的数据)
HashMap<String, String> repeat = new HashMap<String, String>();
HashMap<String, Sed> map = new HashMap<String, Sed>();
Sed[] fir = new Sed[10000];
Sed[] sed = new Sed[10000];
for (int i = 0; i < fir.length; i++) {
fir[i] = new Sed();
sed[i] = new Sed();
}
int n = 0, k = 0;
String line=new String();
String demoFilePath = "D:\\demo.txt";
String destFilePath = "D:\\xieru.txt";
//写入
BufferedReader demoBi = null;
BufferedReader destBi = null;
BufferedWriter bf = null;
try {
demoBi = new BufferedReader(new FileReader(demoFilePath));
destBi = new BufferedReader(new FileReader(destFilePath));
bf = new BufferedWriter(new FileWriter(destFilePath,true));
//读入demo文件的数据
while ((line = demoBi.readLine()) != null) {
fir[n].name = line.substring(0, line.indexOf(" "));
fir[n].no = line.substring(line.indexOf(" ") + 1, line.indexOf(" ") + 10);
fir[n].realsum = 0;
System.out.println(fir[n].name + " " + fir[n].no);
repeat.put(fir[n].no, fir[n].no);
n++;
}
Sed res = new Sed();
//读入xieru文件的数据
while ((line = destBi.readLine()) != null) {
sed[k].name = line.substring(0, line.indexOf(" "));
System.out.println(sed[k].name);
sed[k].no = line.substring(line.indexOf(" ") + 1, line.indexOf(" ") + 10);
System.out.println(sed[k].no);
sed[k].sum = line.substring(line.indexOf(" ") + 11, line.length());
System.out.println(sed[k].sum);
sed[k].realsum = Integer.parseInt(sed[k].sum);
// System.out.println("lll");
res = sed[k];
map.put(sed[k].no, res);
k++;
}
//将demo中的数据 加 到xieru中
Sed flag=new Sed(), flag1=new Sed();
for (int i = 0; i < repeat.size(); i++) {
if (k == 0) {
++fir[i].realsum;
map.put(repeat.get(fir[i].no), fir[i]);
} else if(k!=0) {
flag = map.putIfAbsent(repeat.get(fir[i].no), fir[i]); //如果map中不存在repeat<>则加入,否则不加入
if (flag != null) { //不为null 说明 map中存在了,那么次数直接realsum++;
flag1 = map.get(repeat.get(fir[i].no));
++flag1.realsum;
map.replace(repeat.get(fir[i].no), flag1);
}else if (flag==null){ //flag为null 说明maop中不存在,那么要先让加入map.put(repeat.get(fir[i].no)),且realsum++;
flag=fir[i];
flag.realsum++;
map.put(flag.no,flag);
}
}
}
//写入
for (String key : map.keySet()) {
flag = map.get(key);
line = flag.name + " " + flag.no + " " + flag.realsum;
bf.write(line);
bf.newLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bf.close();
destBi.close();
demoBi.close();
System.out.println("更新成功");
}
}
}
是不是文件已被占用导致直接跳过了