scut2018年机试第一题

       由于复试之前立过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文件应该是错了。

猜你喜欢

转载自blog.csdn.net/Huang_cainiao/article/details/79688267