• 集合综合练习<四>


    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 + "及格人数:" + "	" + (i) + "	" + "不及格人数:" + (list.size() - i));
    			sb.append(name + "及格人数:" + "	" + (i) + "	" + "不及格人数:" + (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() + "	" + "分数:" + entry.getValue());
    				sb = new StringBuffer();
    				sb.append("名字:" + entry.getKey() + "	" + "分数:" + 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() + "	" + "分数:" + entry.getValue());
    						sb.append("学科:" + entry.getKey() + "	" + "分数:" + 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() + "	" + "分数:" + entry.getValue());
    						sb.append("学科:" + entry.getKey() + "	" + "分数:" + 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() + "	" + "分数:" + 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() + "	" + "分数:" + entry.getValue());
    				sb = new StringBuffer();
    				sb.append("
    " + "科目:" + entry.getKey() + "	" + "分数:" + entry.getValue());
    				bw.write(sb.toString());
    				bw.newLine();
    
    			}
    			System.out.println(sum);
    			map3.put(student, sum);// 把分数和人名的映射添加到Map3中
    			bw.write(student + "总分:" + String.valueOf(sum) + "
    ");
    			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();
    			}
    		}
    
    	}
    }
    

      

  • 相关阅读:
    Palindrome Partitioning
    Minimum Path Sum
    Maximum Depth of Binary Tree
    Minimum Depth of Binary Tree
    Unique Binary Search Trees II
    Unique Binary Search Trees
    Merge Intervals
    Merge Sorted Array
    Unique Paths II
    C++ Primer Plus 笔记第九章
  • 原文地址:https://www.cnblogs.com/java-le/p/6443473.html
Copyright © 2020-2023  润新知