由于复试之前立过flag,说如果复试成功的话就要写一篇经验分享,特此实现诺言。复试完后一天,浏览王道论坛,各位大神的经验贴如雨后春笋后冒出来,本人初试较渣,复试也不好,若随意分享出,只怕会自行惭愧,惹人捧腹。所以另辟蹊径,写点机试的东西。
可以说今年华工的笔试和机试都有大的变化,笔试已不再必考排序,更加注重树和图,这里不再阐述。机试的话也放弃了传统的第一题算法题,而改为程序设计题。故对跨考生或者少写代码的人不太友好,这里不是劝退跨考生,而是陈诉事实,希望不要引起误会。并且笔试第一题分数40分,如果难的话我估计大家都做不出来,就像今年一样,因为时间很紧,如果能做出一部分就很棒棒了。好了废话这么多直接上题目。
题目要求是从txt文件中读取信息,再根据一定格式写入到xml文件中去。txt文件中的文本如下
201833,王二,操作系统,70
201834,张三,操作系统,90
201834,张三,嵌入式系统,20
要求写入的xml文件如下
<students>
<student>
<学号>学生学号</学号>
<姓名>学生姓名</姓名>
<课程 课程名="课程名1">分数1</课程>
<课程 课程名="课程名2">分数2</课程>
</student>
</students>
希望大家看清楚输出格式,一个学生是一个student标签,一个student标签里有学号,姓名和多个课程标签。我上机时由于着急就看错了,看成一行txt信息输出成一个sudent标签,气哭。并且题目中要求学生标签是根据学号逆序排序的,这里也要注意。
记得当初进机试机房时,监考老师就说过大家能写多少就写多少,当时不以为然,果然还是太年轻了啊。这个题目我想最好实现的语言就是java,因为java和c++都是面向对象的,但是个人认为java在处理字符串方面相比c++有太大的优势,当然也有主观的因素(因为自己对java比较熟悉,所以一看题目就觉得java写很方便),很方便不表示很简单!!!
由于要逐行读取java文件,我对此并不熟悉,当时是在网上百度到方法的,至于写入xml文件,我记得java也有相应的技术,但没时间了。所以我就采用写txt的方法,只是把文件后缀改成xml。后续回头查看别人博客,应该是不行的。
文件逐行读取操作我当时是参考以下博客的,JAVA逐行读取txt文件。直接改下文件名就行。
至于写入xml文件,后面考完网上查询发现,要用一些专门的jar包会更简单。参考如下博客JAVA文件生成xml文件与xml文件 与 java中用jdom 如何创建xml文档/将数据写入XML中 我采用的是后面一篇博客,需要下载 jdom包http://www.jdom.org/downloads/index.html 点击第一个链接,下载zip文件后,使用第一个jar就行了,build path到你的工程里。我不记得当时提供的包里是否有相关xml的包,但记忆中只有java连接sqlserver和mysql的包,并没有相关xml的。
题目代码实现如下,首先根据题意创建student类
import java.util.ArrayList;
public class Student {
private String stu_id; //学生id
private String stu_name; //学生姓名
private ArrayList<Course> courses; //课程
public Student(String stu_id,String stu_name,ArrayList<Course> courses) {
// TODO Auto-generated constructor stub
this.courses=courses;
this.stu_id=stu_id;
this.stu_name=stu_name;
}
public ArrayList<Course> getCourses() {
return courses;
}
public String getStu_id() {
return stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setCourses(ArrayList<Course> courses) {
this.courses = courses;
}
public void setStu_id(String stu_id) {
this.stu_id = stu_id;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
}
一个学生有多门课程故使用Arraylist来存储课程类,课程类course如下
public class Course {
private String courseName;//课程名
private int score; //分数
Course(String courseName,int score){
this.courseName=courseName;
this.score=score;
}
public String getCourseName() {
return courseName;
}
public int getScore() {
return score;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public void setScore(int score) {
this.score = score;
}
}
接下来是进行实现的类,代码如下,里面有详细注释,就不再解释
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class Main {
//读取txt文本信息
private static ArrayList<String> readFile(String filename){
//设置返回结果
ArrayList<String> result=new ArrayList<>();
/* 读取文件*/
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filename))));
String lineTxt = null;
while ((lineTxt = br.readLine()) != null) {
result.add(lineTxt);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
//将信息写入xml文件
private static void writeFile(Map<String,Student> m,String filename){
//创建文档
Document document=new Document();
//创建根元素,即students标签
Element students=new Element("students");
//根元素加入到document中
document.addContent(students);
Element student;
for(String s:m.keySet()){
//创建学生标签
student=new Element("student");
//创建学号标签并加入到学生标签内
Element e_stuid=new Element("学号");
e_stuid.setText(m.get(s).getStu_id());
student.addContent(e_stuid);
//创建姓名标签并加入到学生标签内
Element e_stuname=new Element("姓名");
e_stuname.setText(m.get(s).getStu_name());
student.addContent(e_stuname);
//循环创建课程标签并加入到学生标签内
for(Course c:m.get(s).getCourses()){
Element e_course=new Element("课程");
e_course.setAttribute("课程名",c.getCourseName());
e_course.setText(c.getScore()+"");
student.addContent(e_course);
}
//将单个学生标签加入到根标签
students.addContent(student);
}
//设置xml输出格式
Format format = Format.getPrettyFormat();
// format.setEncoding("utf-8");//设置编码
format.setIndent(" ");//设置缩进
//得到xml输出流
XMLOutputter out = new XMLOutputter(format);
//把数据输出到xml中
try {
out.output(document, new FileOutputStream(filename));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//用来测试输出map
private static void showMap(Map<String,Student> m){
for(String s:m.keySet()){
System.out.println(m.get(s).getStu_id()+" "+m.get(s).getStu_name()+" ");
for(Course c:m.get(s).getCourses()){
System.out.println(c.getCourseName()+" "+c.getScore());
}
System.out.println("---------------------");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//读取文件获取字符数组
ArrayList<String> strs=readFile("D:\\test.txt");
//因为要对学号进行降序排序,并且一个学生id对应学生类,使用Trrmap存储信息,java中TreeMap元素之间是有序的
Map<String, Student> students=new TreeMap<>(new Comparator<String>() {
//自定义比较器,TreeMap默认为升序
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
//降序
return o2.compareTo(o1);
}
});
//定义字符数组
String []info;
//学生学号
String stu_id;
for(int i=0;i<strs.size();i++){
info=strs.get(i).split(",");//根据逗号进行字符串分割信息
stu_id=info[0];//获取学号
if(!students.containsKey(stu_id)){
//如果map中还未有学号,创建学生对象
Student newstu=new Student(stu_id, info[1], new ArrayList<Course>());
//课程数组加入课程
newstu.getCourses().add(new Course(info[2], Integer.parseInt(info[3])));
//加入到map
students.put(stu_id, newstu);
}
else{
//如果map中已有对象则加入对应学生的课程中即可
students.get(stu_id).getCourses().add(new Course(info[2], Integer.parseInt(info[3])));
}
}
//showMap(students);
//写入xml文件
writeFile(students, "D:\\output.xml");
}
}
d盘中的test.txt文件如下所示
执行后写入的xml文件如下所示
上图也已看出,学号是逆序排序的,并且一个学生有多门课程,是符合题意的。到这就结束了,注意你写的xml文件是可以 被浏览器识别的!!不能以写入txt文件的形式写xml文件。记得我只完成了前面读取txt文件,并封装成对象,写成xml文件应该是错了。