黑马程序员技术交流社区
标题:
关于传比较器的问题 求高手来看下
[打印本页]
作者:
kira
时间:
2014-2-8 13:03
标题:
关于传比较器的问题 求高手来看下
需求是这样的 我现在在键盘上输入学生的名字 数学 语文 和英语 成绩 用逗号隔开over录入结束
然后要求录入的数据 存入到一个文本文件中
下面是我写的代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class StuDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Comparable<Student> com = Collections.reverseOrder();
Set<Student> s =StudentTool.getStu(com);//获取学生
StudentTool.writeToFile(s);//写入学生
}
}
//写学生对象
class Student implements Comparable<Student>{//先让学生具备 比较性
private String name;
private int ma,cn,en;
private int sum;
Student(String name,int ma,int cn,int en){
this.name=name;
this.ma=ma;
this.cn=cn;
this.en=en;
sum =ma+cn+en;//定义和值
}
public String getName(){
return this.name;
}
public int getSum(){
return sum;
}
//这里还可以复写一个哈希code方法
public int hashCode(){
return name.hashCode()+sum*68;
}
@Override
//写一个方法开先匹不匹配
public boolean equals(Object o){
if(!(o instanceof Student))
throw new RuntimeException("类型不匹配");
Student s = (Student)o;//强转为学生
return this.name.equals(s.name)&& this.sum==s.sum;//即为同一个人
}
public String toString(){
;
return "学生["+name+","+ma+","+cn+","+en+"]";
}
@Override
public int compareTo(Student s) {
// TODO Auto-generated method stub
int ii=new Integer(s.sum).compareTo(this.sum);
if(ii==0)
return s.name.compareToIgnoreCase(this.name);
return ii;
}
}
//将学生的信息存入到文件中
class StudentTool{
//定义一个静态方法用于将学生存入到集合中去
public static Set<Student> getStu()throws IOException{
return getStu(null);
}//默认排序
public static Set<Student> getStu(Comparator<Student> cmp)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//记录下键盘
Set<Student> set = null;
if(cmp==null)
set =new TreeSet<Student>();//如果是空则默认
else
set = new TreeSet<Student>(cmp);//否则比较器
//开始读
String line =null;
while((line=br.readLine())!=null){
if("over".equals(line))
break;//如果输入了over 就停止程序
String[] ss =line.split(",");//这个地方用逗号切一下
Student s =new Student(ss[0],Integer.parseInt(ss[1]),Integer.parseInt(ss[2]),Integer.parseInt(ss[3]));
set.add(s);
}
br.close();
return set;
}
public static void writeToFile(Set<Student> se) throws IOException{
BufferedWriter bw = new BufferedWriter(new FileWriter("stu.txt"));
for(Student s:se){
bw.write(s.toString()+"/t");//写学生
bw.write(s.getSum());//写 总分
bw.newLine();
bw.flush();
}
bw.close();
}
}
复制代码
关键就是在主方法中 我现在已经强行逆转了比较器 如果我传入我自己的比较器的话为什么会报错
我的getStu明明有一个传参Comparator的方法 我该怎么修改{:soso_e136:}
作者:
kira
时间:
2014-2-8 16:35
{:soso_e136:}别沉啊
作者:
陈文杰
时间:
2014-2-8 19:03
代码好乱,我是手机党,简述:你想用comparator使集合有自身比较功能,并能进行反转实现你要的排序并保证唯一。而你实现的却是comparable,并把它当作comparator传递,而且集合工具反转得到comparator型的比较器你却用comparable接收,你自己在改改吧,Io我还没自学到。
作者:
kira
时间:
2014-2-9 10:09
陈文杰 发表于 2014-2-8 19:03
代码好乱,我是手机党,简述:你想用comparator使集合有自身比较功能,并能进行反转实现你要的排序并保证唯 ...
。。。我是假设comparable具有比较性是其他人写的 我不修改别人代码的前提下 我自己传一个逆向比较器( 方法Collections.reverseOrder();)comparator
作者:
panzhenglian
时间:
2014-2-9 14:39
你的代码第二十一行写错了,Comparable<Student> com = Collections.reverseOrder();--------->Collections.reverseOrder()的返回值是Comparator接口比较器,把Comparable这个改成Comparator就可以了,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2