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. 安装mangodb

    1.配置yum源 [root@www ~]# cat /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3.4] name=MongoDB Repo ...

  2. 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程

    作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一个ActiveX控件.其中将要讲解关于ActiveX开发的一些基础概念,诸如方法(method).属性(prope ...

  3. Android基础内容提供者ContentProvider的使用详解(转)

    1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不 ...

  4. 查看主机CPU信息

    一.关于CPU的几个概念 CPU的作用 计算机中的中央处理单元(CPU)执行基本的计算工作 -- 运行程序.但是,一个单核的CPU同一时间只能一次执行一个任务,为了提高计算机的处理能力,也就出现了多C ...

  5. 解决js跨域使用nginx配置问题

    在server域中加入以下配置: #解决跨域问题 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-C ...

  6. 【Linux 驱动】简单字符设备驱动架构(LED驱动)

    本文基于icool210开发板,内核版本:linux2.6.35: 驱动代码: (1)头文件:led.h #ifndef __LED_H__ #define __LED_H__ #define LED ...

  7. 【转帖】docker 部署vsftpd服务

    docker 部署vsftpd服务 https://blog.csdn.net/ctwy291314/article/details/82012860 转帖学习一下 docker部署vsftpd服务 ...

  8. 原生CURD

    <?phpheader("content-type:text/html;charset=utf8");$link=mysqli_connect("127.0.0.1 ...

  9. aop设计原理(转)

    本文摘自 博文--<Spring设计思想>AOP设计基本原理 0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢 ...

  10. 2018-2019 ICPC, NEERC, Southern Subregional Contest (codeforces 1070)

    A. 直接从状态(0,0)bfs, 这样一定是最小的 #include <iostream> #include <sstream> #include <algorithm ...