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. 双屏显示——NW.js

    1.利用w10中的双屏显示设置(扩展模式) 2.Code for second window: var gui = require('nw.gui'); gui.Screen.Init(); win ...

  2. 深入理解.NET Core的基元(二)

    原文:Deep-dive into .NET Core primitives, part 2: the shared framework作者:Nate McMaster译文:深入理解.NET Core ...

  3. 临时产品id记录

    id: 5095552c4fb94e01b37561fac5b20b42 cf51ceb55f5341b78592e8fead31e5c8

  4. 【HANA系列】SAP HANA SQL/MDX及TCP/IP端口介绍

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL/MDX ...

  5. Unity 声音与录音与麦克风实时播放

    Unity AudioSource与MicroPhone以及AudioClip之间的关系. 下面是一个声音,长度为7秒钟,声音的实际数据本质是由采样点组成的的列表,一秒钟内的采样点数就是采样频率,下面 ...

  6. 【VS开发】【图像处理】 bayer, yuv, RGB转换方法

    因为我的STVxxx USB camera输出格式是bayer格式,手头上只有YUVTOOLS这个查看工具,没法验证STVxxx在开发板上是否正常工作. 网上找了很久也没找到格式转换工具,最后放弃了, ...

  7. linux环境下编译Android apk

    Android源码目录下的build/envsetup.sh文件,描述编译的命令 - m:       Makes from the top of the tree. - mm:      Build ...

  8. [HAOI2018]苹果树题解

    题目链接 大意:不解释 思路: 首先方案数共有n!种,第1个点只有1种选择,第2个点2种选择,生成2个选择的同时消耗一个,第3个点则有3种选择,依次类推共有n!种方案,由于最后答案*n!,故输出的实际 ...

  9. 赛道修建 NOIP 2018 d1t3

    题目大意 最小值最大 考虑二分 二分答案 判断能不能构成m条路径 很明显满足单调性 可行 思考如何判断 对于一个节点 它的儿子会传上来一些路径 这些路径只有三种处理方式 一.传上去(只能传一条) 二. ...

  10. thread 多线程2

    ###24.04_多线程(多线程程序实现的方式1)(掌握) * 1.继承Thread * 定义类继承Thread * 重写run方法 * 把新线程要做的事写在run方法中 * 创建线程对象 * 开启新 ...