实习的题目跟应届的差不少,只有三个题
1.在有序数组中查找元素,若存在,返回位置;若不存在,返回应该插入的位置
2.统计全校学生的成绩和信息。两个文件,一个score.txt,包含全部学生的学号、科目、单科成绩;一个info.txt,包含学生的学号、学院、专业、姓名。要求输出每个学院每个专业的第一名的姓名,挂科不算。
两个文件:info.txt 存放学生基本信息
学号 学院 专业 姓名
1001 计算机学院 软件工程 刘月
1002 生物工程 服装设计 孙丽
score.txt存放分数信息
学号 学科 成绩
1001 数据结构 85
1001 线性代数 89
1002 数据库 100
1002 面料工艺 30
3.对第一题给出完整的测试程序。
第一题是典型的二分查找,基本所有的有关数据结构与算法的教科书上都找得到。所以在此略过不提。针对第二题,现在给出我的解答,如果中间哪里存在纰漏的话,诸位看家不妨指出来,以求共同进步。整体思路基本如下:
1 创建Student类,各字段按照info文件中属性来安排,在读入info.txt时将Student初始化并放入list中;
2 创建HashMap,读取score.txt,对学号进行hash,map中 的值记录该学生的总成绩,如果有不及格的课程,则总成绩记为-1;
3 为求的最终的输出结果,创建HashMap,对学院以及专业进行hash,map中的值存放一个list,该list中保存最高成绩的那几位同学(包含多个第一名)
废话不多说,上代码:
package cn.xjie.arith;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class MajorScore {
public static void main(String[] args) {
MajorScore ms = new MajorScore();
List<Student> list = ms.getInfo();
Map<String,Integer> scoreMap = ms.getScore();
Map<String,List<Student>> topMap = ms.getTopStu(list, scoreMap);
for(Map.Entry<String, List<Student>> me:topMap.entrySet()){
String schoolMajor = me.getKey();
String str[] = schoolMajor.split("_");
System.out.println(str[0] +"\t" + str[1]+":");
for(Student stu:me.getValue()){
System.out.println(stu.toString() + scoreMap.get(stu.getId()));
}
}
}
//读取info.txt
public List<Student> getInfo() {
try {
List<Student> list = new LinkedList<Student>();
FileReader fr = new FileReader("src/info.txt");
BufferedReader br = new BufferedReader(fr);
int lineNum = 0;
String str;
while ((str = br.readLine()) != null) {
lineNum++;
if (lineNum == 1){
//第一行是列名,故不用读取
continue;
}else{
String info[] = str.split("\\s+"); //文件中有用空格和tab分割来对齐的,所以纯粹用" ",经测试不行,用tab倒是可以
Student stu = new Student(info[0], info[1], info[2], info[3]);
list.add(stu);
}
}
fr.close();br.close();
for (Student stu : list) {
System.out.println(stu.toString());
}
return list;
} catch (Exception e) {
System.out.println("info文件读取出错");
e.printStackTrace();
return null;
}
}
//读取score,放入hashmap,key为学生id,value为总成绩,有不及格的科目不及格的记为-1 HashMap<String,Integer>
public HashMap<String,Integer> getScore(){
Map<String,Integer> map = new HashMap<String,Integer>();
try{
FileReader fr = new FileReader("src/score.txt");
BufferedReader br = new BufferedReader(fr);
int lineNum = 0;
String str;
while ((str = br.readLine()) != null) {
lineNum++;
if (lineNum == 1){
//第一行是列名,故不用读取
continue;
}else{
if(str.matches("^\\s*$")) //str为空格字符串或空字符串
break;
String score[] = str.split("\\s+"); //后来测试又发生一个错误,score文件中存在空行也不行,所以加了上面的检查
if(map.containsKey(score[0]) && (map.get(score[0])!=-1)){
if(Integer.parseInt(score[2])>=60){
map.put(score[0], map.get(score[0])+Integer.parseInt(score[2]));
}else{
map.put(score[0], -1); //不及格总成绩记为-1
}
}else{
map.put(score[0],Integer.parseInt(score[2]));
}
}
}
for(Map.Entry<String, Integer> me:map.entrySet()){
System.out.println(me.getKey()+"\t"+me.getValue());
}
return (HashMap<String, Integer>) map;
}catch (Exception e) {
System.out.println("score文件读取出错");
e.printStackTrace();
return null;
}
}
//考虑重复的情况,所以,map的值里放入List<Student> 学院_专业 为关键字
public Map<String,List<Student>> getTopStu(List<Student> list,Map<String,Integer> scoreMap){
Map<String,List<Student>> topMap = new HashMap<String,List<Student>>();
for(Student stu:list){
String key=stu.getSchool()+ "_"+stu.getMajor();
if(topMap.containsKey(key)){
String id = topMap.get(key).get(0).getId(); //获得该学院最高成绩学生的id
if(scoreMap.get(stu.getId()).compareTo(scoreMap.get(id))<0){ //当前学生与map中的最高成绩做比较
continue;
}else if(scoreMap.get(stu.getId()).equals(scoreMap.get(id))){ //等于则添加
topMap.get(key).add(stu);
}else{ //大于则清空list,然后将stu加入toplist
topMap.get(key).clear();
topMap.get(key).add(stu);
}
}else{
List<Student> toplist = new LinkedList<Student>();
toplist.add(stu);
topMap.put(key, toplist);
}
}
return topMap;
}
}
class Student{
private String id;
private String school;
private String major;
private String name;
public Student(String id, String school, String major, String name) {
super();
this.id = id;
this.school = school;
this.major = major;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", school=" + school + ", major=" + major
+ ", name=" + name + "]";
}
public String toString(int i) {
return "Student [id=" + id + ", school=" + school + ", major=" + major
+ ", name=" + name + "]";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在此附上info.txt
学号 学院 专业 姓名
1001 理学院 信息 张三
1002 化学院 化学 李四
1003 物理学院 物理 王五
1004 理学院 信息 张四
1005 理学院 信息 张五
以及score.txt
学号 课程 成绩
1001 数据结构 89
1003 离散数学 98
1001 离散数学 87
1002 数学 80
1002 离散数学 90
1003 组成原理 87
1005 数据结构 89
1005 离散数学 87
1004 数据结构 100
1004 离散数学 59
最终的输出结果
Student [id=1001, school=理学院, major=信息, name=张三]
Student [id=1002, school=化学院, major=化学, name=李四]
Student [id=1003, school=物理学院, major=物理, name=王五]
Student [id=1004, school=理学院, major=信息, name=张四]
Student [id=1005, school=理学院, major=信息, name=张五]
1003 185
1004 -1
1001 176
1002 170
1005 176
物理学院 物理:
Student [id=1003, school=物理学院, major=物理, name=王五]185
理学院 信息:
Student [id=1001, school=理学院, major=信息, name=张三]176
Student [id=1005, school=理学院, major=信息, name=张五]176
化学院 化学:
Student [id=1002, school=化学院, major=化学, name=李四]170