package com.JiHeTotal;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap; public class TestStudent { public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();// 存储学生信息的学生容器
Map<String, Map<String, Double>> map2 = new HashMap<String, Map<String, Double>>();// 人名和学科、分数的映射
Map<String, Double> map3 = new TreeMap<String, Double>();// 总分和人名的映射(这个地方有点问题就是当总分相同时会发生数据丢失,处理方式是重新定义比较器)
Scanner in = new Scanner(System.in);
try { // 把学生信息加载到List中
PushScodeToList(list); // 总分 // 个人成绩单
totalScode(list, map2, map3); // 生成总分排名文件
List<Map.Entry<String, Double>> list1 = ArrangTotalScode(map3); // 生成班级最高分和最低分的同学的成绩单文件
High_Lower_Scode_File(list, list1); // 生成单科的排名文件(需要输入要生成哪一科)
System.out.println("请输入你要生成排名文件的科目");
String subjectName = in.next();
Per_Subject_ScodeFile(list, subjectName); // 统计及格人数和不及格人数
System.out.println("请输入你要统计及格人数的科目名:");
String name = in.next();
getPersonNumber(list, name); } catch (IOException e) { e.printStackTrace();
} } /*
*
*
* 用来统计及格人数和不及格人数
*
*/
private static void getPersonNumber(List<Student> list, String name) throws IOException {
Iterator<Student> it = list.iterator();// 创建学生对象的容器
int i = 0;// 统计及格人数
StringBuffer sb = null;
BufferedWriter bw = null;
try {
sb = new StringBuffer();
bw = new BufferedWriter(new FileWriter("e:\\getPersonNumber.txt", true));
while (it.hasNext()) {
Student student = (Student) it.next(); Set<Map.Entry<String, Double>> setMap = student.scode.entrySet();
Iterator<Map.Entry<String, Double>> it1 = setMap.iterator(); while (it1.hasNext()) {
Map.Entry<String, Double> entry = (Map.Entry<String, Double>) it1.next();
if (entry.getKey().contains(name) && entry.getValue() >= 60) {
i++;
} }
}
System.out.println(name + "及格人数:" + "\t" + (i) + "\t" + "不及格人数:" + (list.size() - i));
sb.append(name + "及格人数:" + "\t" + (i) + "\t" + "不及格人数:" + (list.size() - i));
bw.write(sb.toString());
bw.newLine();
bw.flush();
} finally {
if (bw != null) {
bw.close();
}
} } /*
*
*
* 生成单科的排名文件(需要输入要生成哪一科)
*
*
*/
private static void Per_Subject_ScodeFile(List<Student> list, String subjectName) throws IOException { Map<String, Double> map = new TreeMap<String, Double>();//
StringBuffer sb = null;
BufferedWriter bw = null;
Iterator<Student> it = list.iterator();// 创建list的迭代器 try {
bw = new BufferedWriter(new FileWriter("e:\\Per_Subject_ScodeFile.txt", true));
while (it.hasNext()) {
Student student = (Student) it.next(); if (student.scode.containsKey(subjectName)) {// 按指定科目进行判断,然后把满足要求的学生姓名和对应的分数加入map中
map.put(student.name, student.scode.get(subjectName));// 把学生名字添加到map中
}
} List<Map.Entry<String, Double>> list1 = new ArrayList<Map.Entry<String, Double>>(map.entrySet());// 把map转化为List
Collections.sort(list1, new MyComparator());// 利用自定义比较器进行排序
bw.write(subjectName);// 把学科名写入文件
bw.newLine();// 换行
for (Entry<String, Double> entry : list1) {
System.out.println("名字:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
sb = new StringBuffer();
sb.append("名字:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
bw.write(sb.toString());
bw.newLine();
bw.flush();// 刷新缓冲区
} } finally {
if (bw != null) {
bw.close();
}
}
} /*
*
*
* 生成班级最高分和最低分的同学的成绩单文件
*
*
*/
private static void High_Lower_Scode_File(List<Student> list, List<Entry<String, Double>> list1)
throws IOException { // 获得最高分数人的姓名
String name = list1.get(0).getKey();
System.out.println(name);
// 获得最低分数人的姓名
String name1 = list1.get(list.size() - 1).getKey();
System.out.println(name1);
StringBuffer sb = null;
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("e:\\High_Lower_Scode_File.txt"));
for (Student stu : list) {// 遍历存储学生对象的容器 // 获得最高分的成绩单
if (stu.name.equals(name)) {// 根据学生姓名找到学生对象存储学科和成绩的map
bw.write(name);// 把学生姓名写入文件
bw.newLine();// 换行
Set<Map.Entry<String, Double>> set = stu.scode.entrySet();// 返回对应map集合Entry节点
Iterator<Map.Entry<String, Double>> it = set.iterator();// 创建迭代器
while (it.hasNext()) {
sb = new StringBuffer();
Map.Entry<String, Double> entry = (Map.Entry<String, Double>) it.next();// 遍历每一个Entry节点
System.out.println("名字:" + name + "学科:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
sb.append("学科:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
bw.write(sb.toString());
bw.newLine();
} // 获得最低分的成绩单
} else if (stu.name.equals(name1)) {
bw.write(name1);
bw.newLine();
Set<Map.Entry<String, Double>> set = stu.scode.entrySet();
Iterator<Map.Entry<String, Double>> it = set.iterator();
while (it.hasNext()) {
sb = new StringBuffer();
Map.Entry<String, Double> entry = (Map.Entry<String, Double>) it.next();
System.out.println("名字:" + name1 + "学科:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
sb.append("学科:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
bw.write(sb.toString());
bw.newLine();
} }
bw.flush();
}
} finally {
if (bw != null) {
bw.close();
}
} } /*
*
* 按TreeMap的值进行总分排序
*
*
*/
private static List<Map.Entry<String, Double>> ArrangTotalScode(Map<String, Double> map3) throws IOException {
List<Map.Entry<String, Double>> list = new ArrayList<Map.Entry<String, Double>>(map3.entrySet());// 把map转化为List Collections.sort(list, new MyComparator());// 利用自定义比较器进行排序 StringBuffer sb = null;
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("e:\\ArrangTotalScode.txt", true));
for (Entry<String, Double> entry : list) {// 遍历排序完成的list
sb = new StringBuffer();
System.out.println("姓名:" + entry.getKey() + "分数:" + map3.get(entry.getKey()));
sb.append("姓名:" + entry.getKey() + "\t" + "分数:" + map3.get(entry.getKey()));
bw.write(sb.toString());
bw.newLine();// 换行
bw.flush();// 刷新缓冲区
}
} finally {
if (bw != null) {
bw.close();
}
}
return list;// 返回有序的list
}
/*
*
* // 总分 // 个人成绩单
*
* *
*/ private static void totalScode(List<Student> list, Map<String, Map<String, Double>> map2, Map<String, Double> map3)
throws IOException { Iterator<Student> it = list.iterator();// 创建学生对象容器list的容器
BufferedWriter bw = null;
StringBuffer sb = null; while (it.hasNext()) {// 外层循环遍历人数
// System.out.println();
Student student2 = (Student) it.next();
System.out.println("id:" + student2.getId());
System.out.println("name" + student2.getName());
map2.put(student2.name, student2.scode);// 往map2中加入人名学科分数的映射 }
System.out.println(map2.size() + "map2");
Set<String> setMap = map2.keySet();// map2的Key代表人名
Iterator<String> it2 = setMap.iterator();// 创建map2的迭代器(map2中存放的是学生姓名和橙装学生科目成绩的映射)
Double sum = 0.0;
while (it2.hasNext()) {
bw = new BufferedWriter(new FileWriter("e:\\PersonScodeMenu.txt", true));
String student = (String) it2.next();// 遍历人(map2的key值部分,也就是人名)
System.out.println(student);// 打印的是人名(测试语句)
Set<Map.Entry<String, Double>> setMap2 = map2.get(student).entrySet();// 第二个小Map
Iterator<Map.Entry<String, Double>> it3 = setMap2.iterator();// 迭代学科和成绩
bw.write(student);// 把人名写入文件中
while (it3.hasNext()) { Map.Entry<String, Double> entry = (Map.Entry<String, Double>) it3.next();
sum = sum + entry.getValue();
System.out.println("科目:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
sb = new StringBuffer();
sb.append("\r\n" + "科目:" + entry.getKey() + "\t" + "分数:" + entry.getValue());
bw.write(sb.toString());
bw.newLine(); }
System.out.println(sum);
map3.put(student, sum);// 把分数和人名的映射添加到Map3中
bw.write(student + "总分:" + String.valueOf(sum) + "\r\n");
bw.flush();
sum = 0.0;
} } /*
*
*
* 把学生信息加载到List中
*
*
*/
private static void PushScodeToList(List<Student> list) throws IOException {
BufferedReader br = null; try {
br = new BufferedReader(new FileReader("e:\\StudeentExamInfo.txt"));// 读取文件 String left = "";//临时存储学生学号的字符串变量
String str = null;// 临时存储按行读取的数据
Student student = null;
Map<String, Double> scode;
while ((str = br.readLine()) != null) {
scode = new HashMap<String, Double>();// 用于存储学科和其对应成绩的容器
// 把读取的信息用split()方法进行分割,得到一个长度为4的字符串数组
String[] str1 = str.split(",");
if (str1.length <= 1) {// 避免行之间的空格导致空指针异常(空行读取的数组长度为1)
continue;
}
//当学号不相等时,我们创建一个学生对象,然后把对应的成绩信息添加到该对象的Map容器中
if (!str1[0].equals(left)) {
scode.put(str1[2], Double.parseDouble(str1[3]));
student = new Student(Integer.parseInt(str1[0]), str1[1], scode);
list.add(student);
left = str1[0];
} else {
student.scode.put(str1[2], Double.parseDouble(str1[3]));
}
System.out.println(scode.size());
}
} finally {
if (br != null) {
br.close();
}
} }
}

  

集合综合练习<四>的更多相关文章

  1. 【Java】集合综合案例 - 播放器管理

    集合综合案例 文章目录 集合综合案例 需求分析 项目演示 详细设计 代码实现 歌曲类 播放器类 播放列表类 测试 参考资料 播放器管理 需求分析 项目演示 详细设计 代码实现 重新搞一波 复习巩固 简 ...

  2. set集合综合案例

    案例01:生成0-10之间5个不相等的数 方法1:使用list集合实现 import random list01 = [] for i in range(100): num01 = random.ra ...

  3. Collections集合工具类,集合嵌套,集合综合案例斗地主

    1 Collections集合工具类 (可以对比Arrays工具类共同记忆) 常用方法: 例: import java.util.ArrayList; import java.util.Collect ...

  4. Java斗地主(集合综合练习)

    ​ 学完了集合后我们可以开始做一个简易版的 " 斗地主 " 了,但是呢咱们这个斗地主只能实现制造牌,洗牌.发牌.看牌这几个简单的功能,并不是我们玩的 " 真人版斗地主 & ...

  5. java基础 数组 Set Map 集合综合应用 生成带0的随机字符串 "00000001" 水果商品号问题

    package com.swift.test01; /*有四种水果(苹果,香蕉,西瓜,橘子) 1.给每种水果设定一个商品号,商品号是8个0-9的随机数,商品号码不能重复, 最小值 "0000 ...

  6. 集合综合练习<三>

    package com.JiHeTotal; import java.util.Comparator; import java.util.Map; import java.util.Map.Entry ...

  7. 集合综合练习<二>

    package com.JiHeTotal; import java.util.Map; public class Student { int id; String name; Map<Stri ...

  8. 集合综合练习<一>

    1208421001,关羽,数学,93 1208421001,关羽,英语,88 1208421002,张飞,语文,82 1208421002,张飞,数学,83 1208421002,张飞,英语,89 ...

  9. JAVA:三种集合LIST、SET、MAP

    1. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...

随机推荐

  1. linux计划crontab

    linux计划crontab 启动crontab服务 一般启动服务用  /sbin/service crond start 若是根用户的cron服务可以用 sudo service crond sta ...

  2. java:struts框架(网路静态U盘项目)

    1.网络静态U盘项目: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYP ...

  3. USACO3.3 A Game【区间dp】

    这道题也是一道非常有意思的区间$dp$,和在纪中的这道题有点像:取数游戏 (除了取数规则其它好像都一样诶) 当时在纪中的时候就觉得这个$dp$非常不好想,状态定义都不是很容易想到. 但是做过一道这种题 ...

  4. 20191224 Spring官方文档(Overview)

    Spring框架概述 从Spring Framework 5.1开始,Spring需要JDK 8+(Java SE 8+),并提供对JDK 11 LTS的现成支持.建议将Java SE 8更新60作为 ...

  5. [转帖]浅谈IOC--说清楚IOC是什么

    浅谈IOC--说清楚IOC是什么 Need Study https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1. ...

  6. MacOS 下文件读取问题

    使用Xcode编写C++程序可以直接使用fstream读写文件,代码如下: const char* path1 = [path UTF8String];string filename = path1; ...

  7. 实例学习——爬取豆瓣音乐TOP250数据

    开发环境:(Windows)eclipse+pydev+MongoDB 豆瓣TOP网址:传送门 一.连接数据库   打开MongoDBx下载路径,新建名为data的文件夹,在此新建名为db的文件夹,d ...

  8. python中几个常见的魔法方法

    首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做"魔法"方法. __ init__()方法 当一个实例被创建的时候调用的初始 ...

  9. 使用RSA算法对接口参数签名及验签

    在不同的服务器或系统之间通过API接口进行交互时,两个系统之间必须进行身份的验证,以满足安全上的防抵赖和防篡改. 通常情况下为了达到以上所描述的目的,我们首先会想到使用非对称加密算法对传输的数据进行签 ...

  10. Jquery复习(一)之animate()易忘点

    可以用 animate() 方法来操作所有 CSS 属性吗? 是的,几乎可以!不过,需要记住一件重要的事情:当使用 animate() 时,必须使用 Camel 标记法书写所有的属性名,比如,必须使用 ...