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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内容是讲TreeSet的自定义比较器,有个小小的疑问,希望大牛们帮我解决。
代码如下:
package com.joe.list;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
* 当元素自身不具备比较性,或者具备的比较性不是所需要的。这时需要让容器自身具备比较性。 定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数
*
* @author joe
*
*/

public class TreeSetDemo2 {
        public static void main(String[] args) {
                TreeSet ts = new TreeSet(new MyCompare());
                 ts.add(new Student2("lisi",23));
                 ts.add(new Student2("lisi1",22));
                 ts.add(new Student2("lisi2",24));
                 ts.add(new Student2("lisi3",21));
                 
                 Iterator it = ts.iterator();
                 while(it.hasNext()){
                         Student2 stu = (Student2)it.next();
                         System.out.println(stu.getName()+"..."+stu.getAge());
                 }
        }

}

//自定义比较器
class MyCompare implements Comparator{
        public int compare(Object o1,Object o2){
                Student2 s1 = (Student2)o1;
                Student2 s2 = (Student2)o2;
               
                int num = s1.getName().compareTo(s2.getName());
                if(num==0)
                {
                        //问题:这里他改为用new Integer对象封装,为啥要封装呢?
                        return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
//                        if(s1.getAge()>s2.getAge())
//                                return 1;
//                        if(s1.getAge()==s2.getAge())
//                                return 0;
//                        return -1;
                }
                return num;
        }
}

class Student2 implements Comparable {
        private String name;
        private int age;

        public Student2(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }

        public Student2() {
                super();
        }

        public String getName() {
                return name;
        }

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

        public int getAge() {
                return age;
        }

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

        @Override
        public String toString() {
                return "Student [name=" + name + ", age=" + age + "]";
        }

        @Override
        public int compareTo(Object obj) {
                if (!(obj instanceof Student2))
                        throw new RuntimeException("不是学生对象");
                Student2 s = (Student2) obj;

                if (this.age > s.age) { // 先比较年龄
                        return 1;
                } else if (this.age < s.age) {
                        return this.name.compareTo(s.name); // 如果年龄相同,在比较名字
                }
                return -1;
        }
}

2 个回复

倒序浏览
姓名相同时再比较年龄(int型),Integer 类重写了compaerTo()方法,int compareTo(Integer anotherInteger),在数字上比较两个 Integer 对象,如果该 Integer 等于 Integer 参数,则返回 0 值;如果该 Integer 在数字上小于 Integer 参数,则返回小于 0 的值;如果 Integer 在数字上大于 Integer 参数,则返回大于 0 的值(有符号的比较)。你可能想用"=="进行比较年龄,但是"=="比较出来的结果是boolean类型的,compare方法的返回值是int类型的。
回复 使用道具 举报
张红(新) 发表于 2015-7-21 11:39
姓名相同时再比较年龄(int型),Integer 类重写了compaerTo()方法,int compareTo(Integer anotherInteger) ...

哦哦,好像懂了~谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马