A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kira 中级黑马   /  2014-2-8 13:03  /  1418 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

需求是这样的 我现在在键盘上输入学生的名字 数学 语文 和英语 成绩 用逗号隔开over录入结束

然后要求录入的数据 存入到一个文本文件中

下面是我写的代码

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.util.Collections;
  8. import java.util.Comparator;
  9. import java.util.Set;
  10. import java.util.TreeSet;

  11. public class StuDemo {

  12.         /**
  13.          * @param args
  14.          * @throws IOException
  15.          */
  16.         public static void main(String[] args) throws IOException {
  17.                 // TODO Auto-generated method stub
  18.                 Comparable<Student> com = Collections.reverseOrder();
  19.                
  20.                 Set<Student> s =StudentTool.getStu(com);//获取学生
  21.                 StudentTool.writeToFile(s);//写入学生

  22.         }

  23. }
  24. //写学生对象
  25. class Student implements Comparable<Student>{//先让学生具备 比较性
  26.         private String name;
  27.         private int ma,cn,en;
  28.         private int sum;
  29.         Student(String name,int ma,int cn,int en){
  30.                 this.name=name;
  31.                 this.ma=ma;
  32.                 this.cn=cn;
  33.                 this.en=en;
  34.                 sum =ma+cn+en;//定义和值
  35.                
  36.                
  37.         }
  38.         public String getName(){
  39.                
  40.                 return this.name;
  41.                
  42.         }
  43.         public int getSum(){
  44.                
  45.                 return sum;
  46.         }
  47.         //这里还可以复写一个哈希code方法
  48.         public int hashCode(){
  49.                
  50.                 return name.hashCode()+sum*68;
  51.                
  52.         }
  53.         @Override
  54.        
  55.        
  56.         //写一个方法开先匹不匹配
  57.         public boolean equals(Object o){
  58.                
  59.                 if(!(o instanceof Student))
  60.                  throw new RuntimeException("类型不匹配");
  61.                 Student s = (Student)o;//强转为学生
  62.                
  63.                 return this.name.equals(s.name)&& this.sum==s.sum;//即为同一个人
  64.                
  65.         }
  66.        
  67.         public String toString(){
  68.                
  69.                 ;
  70.                 return "学生["+name+","+ma+","+cn+","+en+"]";
  71.         }
  72.         @Override
  73.         public int compareTo(Student s) {
  74.                 // TODO Auto-generated method stub
  75.                 int ii=new Integer(s.sum).compareTo(this.sum);
  76.                 if(ii==0)
  77.                         return s.name.compareToIgnoreCase(this.name);
  78.                 return ii;
  79.                
  80.         }

  81.        
  82. }
  83. //将学生的信息存入到文件中

  84. class StudentTool{
  85.         //定义一个静态方法用于将学生存入到集合中去
  86.         public static Set<Student> getStu()throws IOException{
  87.                
  88.                 return getStu(null);
  89.         }//默认排序
  90.         public static Set<Student> getStu(Comparator<Student> cmp)throws IOException{
  91.                
  92.                 BufferedReader br = new  BufferedReader(new InputStreamReader(System.in));//记录下键盘
  93.                 Set<Student> set = null;
  94.                 if(cmp==null)
  95.                         set        =new TreeSet<Student>();//如果是空则默认
  96.                 else
  97.                         set = new TreeSet<Student>(cmp);//否则比较器
  98.                 //开始读
  99.                 String line =null;
  100.                 while((line=br.readLine())!=null){
  101.                         if("over".equals(line))
  102.                                 break;//如果输入了over 就停止程序
  103.                         String[] ss =line.split(",");//这个地方用逗号切一下
  104.                         Student s =new Student(ss[0],Integer.parseInt(ss[1]),Integer.parseInt(ss[2]),Integer.parseInt(ss[3]));
  105.                         set.add(s);
  106.                 }
  107.                 br.close();
  108.                 return set;
  109.         }
  110.        

  111.         public static void writeToFile(Set<Student> se) throws IOException{
  112.                 BufferedWriter bw = new BufferedWriter(new FileWriter("stu.txt"));
  113.                 for(Student s:se){
  114.                        
  115.                         bw.write(s.toString()+"/t");//写学生
  116.                         bw.write(s.getSum());//写 总分
  117.                         bw.newLine();
  118.                         bw.flush();
  119.                        
  120.                 }
  121.                 bw.close();
  122.                
  123.         }

  124. }
复制代码
关键就是在主方法中 我现在已经强行逆转了比较器 如果我传入我自己的比较器的话为什么会报错
我的getStu明明有一个传参Comparator的方法 我该怎么修改{:soso_e136:}

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

4 个回复

正序浏览
你的代码第二十一行写错了,Comparable<Student> com = Collections.reverseOrder();--------->Collections.reverseOrder()的返回值是Comparator接口比较器,把Comparable这个改成Comparator就可以了,
回复 使用道具 举报
陈文杰 发表于 2014-2-8 19:03
代码好乱,我是手机党,简述:你想用comparator使集合有自身比较功能,并能进行反转实现你要的排序并保证唯 ...

。。。我是假设comparable具有比较性是其他人写的 我不修改别人代码的前提下 我自己传一个逆向比较器( 方法Collections.reverseOrder();)comparator
回复 使用道具 举报
陈文杰 来自手机 中级黑马 2014-2-8 19:03:29
藤椅
代码好乱,我是手机党,简述:你想用comparator使集合有自身比较功能,并能进行反转实现你要的排序并保证唯一。而你实现的却是comparable,并把它当作comparator传递,而且集合工具反转得到comparator型的比较器你却用comparable接收,你自己在改改吧,Io我还没自学到。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
{:soso_e136:}别沉啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马