黑马程序员技术交流社区

标题: TreeSet练习中出现的问题 [打印本页]

作者: 韩俊杰    时间: 2013-1-3 14:28
标题: TreeSet练习中出现的问题
本帖最后由 韩俊杰 于 2013-1-3 16:21 编辑

package exam;
import java.util.*;
class Student implements Comparator<Student> {
private String name;
private int age;
private int chengji;
Student(String name,int age,int chengji){
  this.name=name;
  this.age=age;
  this.chengji=chengji;
}

public int compare(Student s1,Student s2){
  int num=new Integer(s1.getChengji()).compareTo(new Integer(s2.getChengji()));
  if (num==0)
   return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  return num;
}

public int hashCode(){
  return name.hashCode()+age*20;
}

public boolean equals(Object obj){
  if(!(obj instanceof Student))
   throw new ClassCastException("类型不匹配");
  Student stu=(Student)obj;
  return this.name.equals(stu.name) && this.age==stu.age;
}
public int getAge() {
  return age;
}
public void setAge(int age) {
  this.age = age;
}
public int getChengji() {
  return chengji;
}
public void setChengji(int chengji) {
  this.chengji = chengji;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
}
public class TreeSetExam {

public static void sop(Object obj){
  System.out.println(obj);
}

public static void main(String[] args) {
  Student stu1=new Student("zhangsan",21,90);
  Student stu2=new Student("lisi",22,80);
  Student stu3=new Student("wangwu",23,70);
  Student stu4=new Student("zhaoliu",24,60);
  Student stu5=new Student("tianqi",25,50);
  
  TreeSet<Student> ts=new TreeSet<Student>();
  ts.add(stu1);
  ts.add(stu2);
  ts.add(stu3);
  ts.add(stu4);
  ts.add(stu5);
  
  Iterator<Student> it=ts.iterator();
  while(it.hasNext()){
   Student s=it.next();
   sop(s.getName()+"\t"+s.getAge()+"\t"+s.getChengji());
  }
}
}

我的程序编译没有问题,但是运行时出现 exam.Student cannot be cast to java.lang.Comparable
只能添加stu1一个数据,其它的都不能添加。
还有就是我想按照成绩进行升序排序,怎么做?


作者: 刘文超    时间: 2013-1-3 15:29
本帖最后由 刘文超 于 2013-1-3 15:42 编辑

lz你好,这个问题应该先按照Student类定义一个比较器,也就是按照成绩去比较学生。
而TreeSet的构造中就可以用一个比较器初始化的、之后集合的元素将按这个比较的方法来给我们对象排序。
下边是我的代码,运行能通过,得到目标结果,但肯定也有好多不适之处,大家共同学习,共同进步!
  1. package com.itheima;

  2. import java.util.Comparator;
  3. import java.util.Iterator;
  4. import java.util.TreeSet;

  5. public class Test10 {

  6.         /**
  7.          * 第十题:定义一个学生类, 需要有姓名, 年龄, 考试成绩三个成员属性,
  8.          *                      创建5个对象, 属性可为任意值.
  9.          *                编程对这5个对象按成绩排序,并将结果输出。(提示,用TreeSet和Comparator实现)
  10.          * @author 刘文超
  11.          */
  12.        
  13.         public static void main(String[] args) {
  14.                 //定义一个集合,用于封装学生,传入一个比较器
  15.                 TreeSet<MyStudent> msSet=new TreeSet<MyStudent>(new MyComparator());
  16.                 //定义5个学生
  17.                 MyStudent ms1=new MyStudent("a",20,90);
  18.                 MyStudent ms2=new MyStudent("b",20,80);
  19.                 MyStudent ms3=new MyStudent("c",20,75);
  20.                 MyStudent ms4=new MyStudent("d",20,95);
  21.                 MyStudent ms5=new MyStudent("e",20,70);
  22.                 //装进集合中
  23.                 msSet.add(ms1);
  24.                 msSet.add(ms2);
  25.                 msSet.add(ms3);
  26.                 msSet.add(ms4);
  27.                 msSet.add(ms5);
  28.                 //用迭代器取出来
  29.                 Iterator<MyStudent> it=msSet.iterator();
  30.                 while(it.hasNext()){
  31.                         MyStudent ms=it.next();
  32.                         System.out.println(ms.getName()+","+ms.getAge()+","+ms.getGrade());
  33.                 }
  34.                 /*打印结果为:
  35.                                         e,20,70
  36.                                         c,20,75
  37.                                         b,20,80
  38.                                         a,20,90
  39.                                         d,20,95
  40.                       可以看出,已经按照grade升序排列了、                       
  41.                 */
  42.         }
  43. }

  44. //定义一个比较器,实现compare方法
  45. class MyComparator implements Comparator<MyStudent>{
  46.         @Override
  47.         public int compare(MyStudent o1, MyStudent o2) {
  48.                 // TODO Auto-generated method stub
  49.                 int flag=0;
  50.                 if(o1.getGrade()>o2.getGrade()){
  51.                         flag=1;
  52.                 }else if(o1.getGrade()<o2.getGrade()){
  53.                         flag=-1;
  54.                 }
  55.                 return flag;
  56.         }
  57. }

  58. //学生类
  59. class MyStudent {
  60.        
  61.         private String name;
  62.         private int age;
  63.         private int grade;

  64.         //构造方法
  65.         public MyStudent(){};
  66.        
  67.         public MyStudent(String name, int age, int grade) {
  68.                 this.name = name;
  69.                 this.age = age;
  70.                 this.grade = grade;
  71.         }
  72.        
  73.         //getters and setters
  74.         public String getName() {
  75.                 return name;
  76.         }

  77.         public void setName(String name) {
  78.                 this.name = name;
  79.         }

  80.         public int getAge() {
  81.                 return age;
  82.         }

  83.         public void setAge(int age) {
  84.                 this.age = age;
  85.         }

  86.         public int getGrade() {
  87.                 return grade;
  88.         }

  89.         public void setGrade(int grade) {
  90.                 this.grade = grade;
  91.         }
  92. }
复制代码

作者: wugewuna    时间: 2013-1-3 15:43
你的Student还没有实现Comparator呢!当然添加不了啊

作者: wugewuna    时间: 2013-1-3 15:46
哦,错了,是实现comparable接口,你也可以再TreeSet的构造器中添加一个实现了Comparator接口的内部类
作者: 黄锦成    时间: 2013-1-3 21:59
学生类不应该实现“Comparator”,Comparator是给集合的构造方法用的,学生应该实现Comparable接口,class Student implements Comparable<Student>,把里面的方法改成compareTo
作者: 高阳    时间: 2013-1-3 22:00
二楼,你的手太快了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2