集合综合练习<四>
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();
}
} }
}
集合综合练习<四>的更多相关文章
- 【Java】集合综合案例 - 播放器管理
集合综合案例 文章目录 集合综合案例 需求分析 项目演示 详细设计 代码实现 歌曲类 播放器类 播放列表类 测试 参考资料 播放器管理 需求分析 项目演示 详细设计 代码实现 重新搞一波 复习巩固 简 ...
- set集合综合案例
案例01:生成0-10之间5个不相等的数 方法1:使用list集合实现 import random list01 = [] for i in range(100): num01 = random.ra ...
- Collections集合工具类,集合嵌套,集合综合案例斗地主
1 Collections集合工具类 (可以对比Arrays工具类共同记忆) 常用方法: 例: import java.util.ArrayList; import java.util.Collect ...
- Java斗地主(集合综合练习)
学完了集合后我们可以开始做一个简易版的 " 斗地主 " 了,但是呢咱们这个斗地主只能实现制造牌,洗牌.发牌.看牌这几个简单的功能,并不是我们玩的 " 真人版斗地主 & ...
- java基础 数组 Set Map 集合综合应用 生成带0的随机字符串 "00000001" 水果商品号问题
package com.swift.test01; /*有四种水果(苹果,香蕉,西瓜,橘子) 1.给每种水果设定一个商品号,商品号是8个0-9的随机数,商品号码不能重复, 最小值 "0000 ...
- 集合综合练习<三>
package com.JiHeTotal; import java.util.Comparator; import java.util.Map; import java.util.Map.Entry ...
- 集合综合练习<二>
package com.JiHeTotal; import java.util.Map; public class Student { int id; String name; Map<Stri ...
- 集合综合练习<一>
1208421001,关羽,数学,93 1208421001,关羽,英语,88 1208421002,张飞,语文,82 1208421002,张飞,数学,83 1208421002,张飞,英语,89 ...
- JAVA:三种集合LIST、SET、MAP
1. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...
随机推荐
- Centos下使用subversion
Centos下使用subversion 1.安装 yum install subversion 2.创建版本库 a.mkdir -p /var/svn/repositories(创建版本库目录) b. ...
- linux常用命令(22)gzip命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以用 ...
- linux系统导入证书
https://blog.csdn.net/fy573060627/article/details/52872740 .linux 访问 https 证书问题 [root@kube-node2 ~]# ...
- CentOS 升级 openSSH+ sh脚本自动运维
升级前后对比 openSSH作为linux远程连接工具,容易受到攻击,必须更新版本来解决,低版本有如下等漏洞: OpenSSH 远程代码执行漏洞(CVE-2016-10009) OpenSSH au ...
- springboot--websocket简单demo(一):session chat
最近跟着大佬 https://tycoding.cn/2019/06/16/project/boot-chat/ 敲了2个关于websocket的demo,总结一下 从将会话信息保存在session中 ...
- Akka系列(十):Akka集群之Akka Cluster
前言........... 上一篇文章我们讲了Akka Remote,理解了Akka中的远程通信,其实Akka Cluster可以看成Akka Remote的扩展,由原来的两点变成由多点组成的通信网络 ...
- Layui关闭弹出层并刷新父窗口
先确保已经引入layui和jquery 再确保初始化layer弹出层 <script> layui.use(['form', 'layer'], function() { var form ...
- openstack docker build error
1. _proto_tcp = socket.getprotobyname('tcp') OSError: protocol not found you should have a /etc/prot ...
- crm客户资源显示控制
为便于员工之间的良性竞争,避免恶意挖客户,对于不同的登录用户,在客户列表中只显示当用用户自己所拥有的客户列表. ---具体的,通过在列表显示界面的列表查询语句中增加根据用户id查询其对应的客户资源的条 ...
- git 计算commit
转自:https://www.cnblogs.com/jwentest/p/8186712.html#!/bin/bash f1="$1*" f2="$2*" ...