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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘际昌 中级黑马   /  2013-11-23 14:55  /  2090 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 潘际昌 于 2013-11-24 00:54 编辑

import java.util.*;



public class Test
{

        public static void main(String[] args) {
                TreeSet<Student> ts=new TreeSet<Student>(new myComparator());
                ts.add(new Student("zhangsan1",20,97));
                ts.add(new Student("zhangsan2",21,99));
                ts.add(new Student("zhangsan5",25,95));
                ts.add(new Student("zhangsan3",19,98));
                ts.add(new Student("zhangsan7",15,90));
                Iterator<Student> it = ts.iterator();
                while(it.hasNext())
                {
                        Student s= it.next();
                        System.out.println(s.getName()+","+s.getAge()+","+s.getScore());
                }
                                
        }

}
class myComparator implements Comparator<Student>
{
        public int compare(Student s1,Student s2)
        {
               
               
        
                int num=new Integer(s1.getScore()).compareTo(new Integer(s2.getScore()));
                if(num==0)
                {
                        return s1.getName().compareTo(s2.getName());
                }
                return num;
        }
        
        
}
class Student
{
        String name;
        int age;
        int score;
        Student(String name,int age,int score)
        {
                this.name=name;
                this.age=age;
                this.score=score;
        }
        String getName()
        {
                return name;
        }
        int getAge()
        {
                return age;
        }
        int getScore()
        {
                return score;
        }
        
        
}比较器里面,为什么 s1.getName().compareTo(s2.getName());字符型可以直接比较,而int型        
int num=new Integer(s1.getScore()).compareTo(new Integer(s2.getScore()));还需要new Interger()呢?



评分

参与人数 1技术分 +1 收起 理由
FFF + 1 下次代码要放代码框里哦~

查看全部评分

5 个回复

倒序浏览
字符串就是对象,可以直接compareTo进行比较,int型是基本数据类型,得装箱成Integer对象类型,才可以用compareTo进行比较,所以要new Ingeger()      
API里面compareTo(T o) 方法
          比较此对象与指定对象的顺序。
回复 使用道具 举报
这个帖子,论坛上以前发过啊?怎么又重发一遍。
查jdk可知:
public interface Comparable<T>此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

compareToint compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数:
o - 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:
ClassCastException - 如果指定对象的类型不允许它与此对象进行比较
所以CompareTo方法是比较两个对象,不能比较基本数据类型,所以int型要包装成Integer类型对象类型进行比较。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 努力全是自己的总结就更好了!.

查看全部评分

回复 使用道具 举报
compareTo方法是对对象用的,字符串是对象,所以可以,而int是数据类型,需要封箱后来比较,所以会有new integer()这样的代码
回复 使用道具 举报
在你的类中,字符串是string对象引用,是个对象,
而数字在JDK1.5后的有自动装箱和自动拆箱功能,
你直接用数字调用compareTo()方法时,必须时对象来调用,但由于JDK1.5后的特性,导致compareTo方法无法确定数字是对象还是基本类型,new Integer()来修饰
回复 使用道具 举报
compareTo()两边都是对象,不是类型。
s1.getName().compareTo(s2.getName())完整写法是
newString(s1.getName()).compareTonewString((s2.getName()));
因为有了自动装箱功能,所以可以简写。
这里似乎只限于字符型有自动装箱。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马