问题如下:
1.首先,有一个用记事本记录的文本文档,里面记录的是学生的成绩信息。记录的信息为:实验中学初中或者高中(用代码表示10字节),年级(代码表示),班级,学号,姓名,语文成绩,数学成绩,物理成绩,化学成绩,生物成绩。记录格式如下:
123456789实验中学初中11156789张三100100100099099
223456789实验中学高中23178963李四099100100100100
                .
                .
                .
123456789实验中学初中22156987小王100100100099099
注:记录信息数量很多
2.用程序读这个文件,将学生总成绩按升序排列,并打印出到另一个文本文档。
  要求为:(1)要按升序排列,并且要按由初中到高中、年级由低到高、班级顺序排列显示
          (2)分别按班和按年级、按初中、高中统计出平均成绩
          (3)统计出各班前三名学生
3.最后输出格式大致为:
初中/高中    年级   班级  姓名     语文  数学  物理  化学  生物  总分
实验中学初中  1      1   张三     100  100  100   99   99   498
实验中学初中  1      1   小三     99  100  100   99    99   497
实验中学初中  1      1   张里     100  100  99   98    99   496
实验中学初中  1      1   班平均   88    87  84   86    90   435
                     .
                     . 
                     .
实验中学高中  2      3   李四     99   100  100   100  100  499
实验中学高中  2      3   CC       99   99  100   100   100  498 
实验中学高中  2      3   VV       99   99  100   99    100  497 
实验中学高中  2      3   班平均    80   82  80   85     88   415    
                     .
                     .
                     .
希望大家一起来讨论如何解决这个问题,达到最后的输出结果。盼望各位大侠、猛将兄们,将你们的解决方案提供出来,大家学习,探讨。在这个过程中,大家学习如何对文件进行读写,以及对于大量数据如何进行快速有效的排序。        
  

解决方案 »

  1.   

    楼主,一步步来,首先读文件,用字符流来读,这样可以一行一行的处理(BufferedReader类),然后对读出来的每一行以' '进行split分割,然后读入到ArrayList中,由于你是二维数据,所以肯定需要二维的ArrayList对于排序及求和的情况,建议采用Jdk的comparable接口,这样对于任意的行数据(每行数据都是一个ArrayList),可以比较不同的字段(其实如果做得好的话应该用VO领域对象来存储,这样就类似于数据库的操作了)总的来说还是不难的,要做得扩展一点的话最好写一个专门的二维ArrayList比较的公用类,之前我做项目的时候写过,那时也是不能用VO对象来比较,只能直接比较二维数组,郁闷~~
      

  2.   

    楼主,我认为你的想法不对,并不是把问题往 CSDN 上一放,就会有人把写好的代码贴出来的。你之所以冠以“讨论”二字,你是否需要先说说自己的想法呢?这个程序除了一步一步的做之外,几乎没有什么地方可以提升效率。
      

  3.   

    我做了个大概的代码如下:
    package stu;import java.io.*;
    /**
     * 
     * @author new
     *
     */
    class Reading{
    //定义变量
    long X_code;
    String X_name;
    int Gla_num;
    int Cla_num;
    long S_num;
    String S_name;
    long yuwen,shuxue,wuli,huaxue,shengwu;
    long zhonghe;
    int i=0,j=0;//计算学校名和学生名的长度
    String xueming=" ";
    String mingcheng=" ";
    String chengji=" ";
    String num=" ";
    String banping=" ";
    String nianping=" ";
    String xueping=" ";
    //构造函数
    /**
     * @param s
     */
    Reading(String s){
    String yw;
    String sx;
    String wl;
    String hx;
    String sw;
    String xcode;
    String glassnum;
    String classnum;
    String snum;
    char[] ch=s.toCharArray();
    //取学校编码
    xcode=new String(ch,0,9);//6666
        try{
    X_code=Long.parseLong(xcode);
    }
    catch(NumberFormatException e)
    {
    System.out.println("学校的编码有误,请输入正确的学校的编码。");
    System.exit(1);
    }
    if(Character.isDigit(ch[10]))
    {
    System.out.println("学校的编码过长。");
    System.exit(1);
    }
    //取学校名
    else
    {

      while(!Character.isDigit(ch[10+i]))
    {
    i++;
        }

    X_name=new String(ch,10,i).toString();//777777
    }
    //取年级
    glassnum=new String(ch,(10+i),1);
    try{
    Gla_num=Integer.parseInt(glassnum);
    }
    catch(NumberFormatException e){
    System.out.println(glassnum);
    System.out.println("班号有误");
    System.exit(1);
    }

    if(Gla_num==0){
    System.out.println("年级号有误");
    System.exit(1);
    }
    //取班级
    else
    {
    if(!Character.isDigit(ch[11+i])){
    System.out.println("班号有误");
    System.exit(1);
    }
    else
    {
    classnum=new String(ch,(11+i),1);
    try{
    Cla_num=Integer.parseInt(classnum);
    }
    catch(NumberFormatException e)
    {
    System.out.println("年级号不对");
    System.exit(1);
    }
    if(Cla_num==0){
    System.out.println("班号有错误");
    System.exit(1);
    }
    }

    }
    //取学号
    snum=new String(ch,(12+i),6);
    try{
    S_num=Long.parseLong(snum);
    }
    catch(NumberFormatException e)
    {
    System.out.println("学号有错误");
    System.exit(1);
    }
    if(Character.isDigit(ch[18+i])){
    System.out.println("学号过长");
    System.exit(1);
    }
    //取学生名
    while(!Character.isDigit(ch[18+i])){
    i++;
    j++;
    }

    {
    S_name=new String(ch,(18+i-j),j);//888
    }
    //取语文成绩
    yw=new String(ch,(18+i),3);
    try{
    yuwen=Long.parseLong(yw);
    }
    catch(NumberFormatException e){
    System.out.println("语文成绩出错");
    System.exit(1);
    }
    if(yuwen<0||yuwen>100){
    System.out.println("语文成绩分数有错");
    System.exit(1);
    }
    //取数学成绩
    sx=new String(ch,(21+i),3);
    try{
    shuxue=Long.parseLong(sx);
    }
    catch(NumberFormatException e){
    System.out.println("数学成绩有错");
    System.exit(1);
    }
    if(shuxue<0||shuxue>100){
    System.out.println("数学成绩分数有错");
    System.exit(1);
    }
    //取物理成绩
    wl=new String(ch,(24+i),3);
    try{
    wuli=Long.parseLong(wl);
    }
    catch(NumberFormatException e){
    System.out.println("物理成绩出错");
    System.exit(1);
    }
    if(wuli<0||wuli>100){
    System.out.println("物理成绩分数有错");
    System.exit(1);
    }
    //取化学成绩
    hx=new String(ch,(27+i),3);
    try{
    huaxue=Long.parseLong(hx);
    }
    catch(NumberFormatException e){
    System.out.println("化学成绩出错");
    System.exit(1);
    }
    if(huaxue<0||huaxue>100){
    System.out.println("化学成绩分数出错");
    System.exit(1);
    }
    //取生物成绩
    sw=new String(ch,(30+i),3);
    try{
    shengwu=Long.parseLong(sw);
    }
    catch(NumberFormatException e){
    System.out.println("生物成绩出错");
    System.exit(1);
    }
    if(shengwu<0||shengwu>100){
    System.out.println("生物成绩分数有错");
    System.exit(1);
    }
    else
    {
    zhonghe=yuwen+shuxue+wuli+huaxue+shengwu;
    }
    }
      

  4.   

    Reading(){}
    public String geshi(String s1,String s2){
    if(s2.length()<s1.length()){
    return s2+s1.substring(s2.length());
    }
    return s2;
    }
    void printqiansanming(){
    System.out.println(geshi(xueming,X_name)+"     "
    +geshi(num,Integer.toString(Gla_num))+"    "
    +geshi(num,Integer.toString(Cla_num))+"    "
    +geshi(mingcheng,S_name)+"    "
    +geshi(chengji,Long.toString(yuwen))+"    "
    +geshi(chengji,Long.toString(shuxue))+"    "
    +geshi(chengji,Long.toString(wuli))+"    "
    +geshi(chengji,Long.toString(huaxue))+"     "
    +geshi(chengji,Long.toString(shengwu))+"    "
    +geshi(chengji,Long.toString(zhonghe)));
    }
    void printbanpingjun(int bren){
    System.out.println(geshi(xueming,X_name)+"     "
    +geshi(num,Integer.toString(Gla_num))+"    "
    +geshi(num,Integer.toString(Cla_num))+"  "
    +geshi(banping,"班級平均")+"  "
    +geshi(chengji,Long.toString(yuwen/bren))+"    "
    +geshi(chengji,Long.toString(shuxue/bren))+"    "
    +geshi(chengji,Long.toString(wuli/bren))+"    "
    +geshi(chengji,Long.toString(huaxue/bren))+"     "
    +geshi(chengji,Long.toString(shengwu/bren))+"     "
    +geshi(chengji,Long.toString(zhonghe/bren)));
    }
    void printnianpingjun(int nren){
    System.out.println(geshi(xueming,X_name)+"     "
    +geshi(num,Integer.toString(Gla_num))+"       "
    +geshi(nianping,"年級平均")+"  "
    +geshi(chengji,Long.toString(yuwen/nren))+"    "
    +geshi(chengji,Long.toString(shuxue/nren))+"    "
    +geshi(chengji,Long.toString(wuli/nren))+"    "
    +geshi(chengji,Long.toString(huaxue/nren))+"      "
    +geshi(chengji,Long.toString(shengwu/nren))+"    "
    +geshi(chengji,Long.toString(zhonghe/nren)));
    }
    void printxuepingjun(int xren){
    System.out.println(geshi(xueming,X_name)+"             "
    +geshi(xueping,"学校平均")+"  "
    +geshi(chengji,Long.toString(yuwen/xren))+"    "
    +geshi(chengji,Long.toString(shuxue/xren))+"    "
    +geshi(chengji,Long.toString(wuli/xren))+"     "
    +geshi(chengji,Long.toString(huaxue/xren))+"     "
    +geshi(chengji,Long.toString(shengwu/xren))+"    "
    +geshi(chengji,Long.toString(zhonghe/xren)));
    }
    }
    public class Student{
    public static void main(String arg[]){
    String ss;
    Reading r0=new Reading();
    int X_renshu,G_renshu,C_renshu;
    Reading r1,r2,r3,r4,r5,r6,r7;
    RandomAccessFile rb;
    try{
    rb=new RandomAccessFile("D:\\代码保存\\stu.txt","r");
    ss=rb.readLine();
    if(ss!=null){
    System.out.println(r0.geshi(r0.xueming,"学校名")
    +"    "+r0.geshi(r0.num,"年级")+"   "
    +r0.geshi(r0.num,"班")+"    "+r0.geshi(r0.mingcheng,"姓名")
    +"    "+r0.geshi(r0.chengji,"语文")+"    "+r0.geshi(r0.chengji,"数学")+"    "
    +r0.geshi(r0.chengji,"物理")+"    "+r0.geshi(r0.chengji,"化学")+"    "
    +r0.geshi(r0.chengji,"生物")+"    "+r0.geshi(r0.chengji,"总分"));
    r1=new Reading(ss);//取出班上第一名成绩
    r2=new Reading();//取出班上第二名成绩
    r3=new Reading();//取出班上第三名成绩
    r4=new Reading(ss);//取出同一个班的总成绩
    r5=new Reading(ss);//取出同一个年级的总成绩
    r6=new Reading(ss);//取出同一个学校的总成绩
    r7=new Reading(ss);//取出当前总成绩
    C_renshu=1;
    G_renshu=1;
    X_renshu=1;
    ss=rb.readLine();
    while(ss!=null){
    r7=new Reading(ss);
    if(r4.X_code!=r7.X_code){
    r1.printqiansanming();
    r2.printqiansanming();
    r3.printqiansanming();
    r4.printbanpingjun(C_renshu);
    r5.printnianpingjun(G_renshu);
    r6.printxuepingjun(X_renshu);
    X_renshu=1;
    G_renshu=1;
    C_renshu=1;
    r1=new Reading(ss);;
    r2=new Reading();
    r3=new Reading();
    r4=new Reading(ss);;
    r5=new Reading(ss);;
    r6=new Reading(ss);;
    }
    else
    {
    X_renshu++;
    //学校人数增加的话,增加学校内各科成绩和取出当前的各科成绩
    r6.yuwen=r6.yuwen+r7.yuwen;
    r6.shuxue=r6.shuxue+r7.shuxue;
    r6.wuli=r6.wuli+r7.wuli;
    r6.huaxue=r6.huaxue+r7.huaxue;
    r6.shengwu=r6.shengwu+r7.shengwu;
    r6.zhonghe=r6.zhonghe+r7.zhonghe;
    if(r4.Gla_num!=r7.Gla_num){
    r1.printqiansanming();
    r2.printqiansanming();
    r3.printqiansanming();
    r4.printbanpingjun(C_renshu);
    r5.printnianpingjun(G_renshu);
    G_renshu=1;
    C_renshu=1;
    r1=new Reading(ss);;
    r2=new Reading();
    r3=new Reading();
    r4=new Reading(ss);;
    r5=new Reading(ss);;
    }
    else
    {
    G_renshu++;
    //年级人数增加的话,增加年级内各科成绩和取出当前的各科成绩
    r5.yuwen=r5.yuwen+r7.yuwen;
    r5.shuxue=r5.shuxue+r7.shuxue;
    r5.wuli=r5.wuli+r7.wuli;
    r5.huaxue=r5.huaxue+r7.huaxue;
    r5.shengwu=r5.shengwu+r7.shengwu;
    r5.zhonghe=r5.zhonghe+r7.zhonghe;
    if(r4.Cla_num!=r7.Cla_num){
    r1.printqiansanming();
    r2.printqiansanming();
    r3.printqiansanming();
    r4.printbanpingjun(C_renshu);
    C_renshu=1;
    r1=new Reading(ss);;
    r2=new Reading();
    r3=new Reading();
    r4=new Reading(ss);
    }
    else
    {
    C_renshu++;
    //班级人数增加的话,增加班级内各科成绩和取出当前的各科成绩
    r4.yuwen=r4.yuwen+r7.yuwen;
    r4.shuxue=r4.shuxue+r7.shuxue;
    r4.wuli=r4.wuli+r7.wuli;
    r4.huaxue=r4.huaxue+r7.huaxue;
    r4.shengwu=r4.shengwu+r7.shengwu;
    r4.zhonghe=r4.zhonghe+r7.zhonghe;
    if(r7.zhonghe>r1.zhonghe){
    r3=r2;
    r2=r1;
    r1=r7;
    }
    else
    {
    if(r7.zhonghe>r2.zhonghe){
    r3=r2;
    r2=r7;
    }
    else
    {
    if(r7.zhonghe>r3.zhonghe){
    r3=r7;
    }
    }
    }
    }
    }
    }
    ss=rb.readLine();
    }
    r1.printqiansanming(); if(C_renshu>1)
    r2.printqiansanming();
    if(C_renshu>2)
    r3.printqiansanming();
    r4.printbanpingjun(C_renshu);
    r5.printnianpingjun(G_renshu);
    r6.printxuepingjun(X_renshu);
    }
    rb.close();
    }
    catch(IOException e){
    System.out.println("输出完毕");
    System.exit(1);
    }
    }
    }