Java中TreeSet总结

学生类:

package day17_Set2;

import java.util.Comparator;

/*
 * 如果一个类的元素想要进行自然排序,就必须实现自然排序接口
 * 
 * */
public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

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

    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 int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    //重写比较类
    @Override
    public int compareTo(Student o) {
        //按年龄大小排序
//      // TODO Auto-generated method stub
//      //return 0;
//      //return 1;
//      
//      //这里返回数目,其实应该根据我的排序规则来做
//      //按照年龄排序,主要条件
//      int num=this.age-o.age;
//      //次要条件
//      //年龄相同的时候,还得去看姓名是否也相同
//      //如果年龄和姓名都相同,才是同一个元素
//      int num2=num==0?this.name.compareTo(o.name):num;
//      return num2;
        //按姓名长度比较
        //主要条件
        int num=this.name.length()-o.name.length();
        //姓名长度相同,不代表姓名的内容也相同
        int num2=num==0?this.name.compareTo(o.name):num;
        //姓名的长度和内容相同,不代表年龄相同,所以还得判断年龄
        int num3=num2==0?this.age-o.age:num2;
        return num3;
    }

//  @Override
//  public int hashCode() {
//      // TODO Auto-generated method stub
//      
//      return this.name.hashCode()+this.age*10;
//  }
//  @Override
//  public boolean equals(Object obj) {
//      // TODO Auto-generated method stub
//      if(this==obj){
//          return true;
//      }
//      if(!(obj instanceof Student)){
//          return false;
//      }
//      Student s=(Student)obj;
//      return this.name.equals(s.name)&&this.age==s.age;
//  }

}

测试类1:

package day17_Set2;

import java.util.TreeSet;

/*
 * TreeSet存储自定义对象并保证排序和唯一。
 * 
 * A:你没有告诉我怎么排序
 *      自然排序,按照年龄从小到大
 * B:元素什么情况算唯一,你也没告诉我
 *      成员变量值相同即为同一个元素
 * */
public class TreeSetDemo2 {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Student> ts = new TreeSet<Student>();
        //创建元素
        Student s1 = new Student("linqingxia",27);
        Student s2=new Student("zhangguorong",29);
        Student s3=new  Student("wanglihong",23);
        Student s4=new Student("linqingxia",27);
        Student s5=new Student("liushishi",22);
        Student s6=new Student("wuqilong ",40);
        Student s7=new Student("fengqingy",22);

        //添加元素
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);
        ts.add(s7);

        //遍历
        for(Student s:ts){
            System.out.println(s.getName()+"--"+s.getAge());
        }
    }

}

测试类2:

package day17_Set2;

import java.util.Comparator;
import java.util.TreeSet;
/*
 * 需求:请按照姓名的长度排序
 * 
 * TreeSet集合保证元素和唯一性的原理
 * 唯一性:是根据比较的返回值是否是0决定的
 * 排序:
 *      A:自然排序(元素具备比较性)
 *          让元素所属的类实现自然排序的接口Comparable
 *      B:比较器排序(集合具备比较性)
 *          让集合的构造方法接收一个比较器接口的子类对象Comparator
 * */
public class TreeSetDemo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 创建集合对象
        //比较器排序
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            //如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
            //而匿名类就可以实现这个东西

            @Override
            public int compare(Student o1, Student o2) {
                // TODO Auto-generated method stub
                //姓名长度
                int num=o1.getName().length()-o2.getName().length();
                //姓名内容
                int num2=num==0?o1.getName().compareTo(o2.getName()):num;
                //年龄
                int num3=num2==0?o1.getAge()-o2.getAge():num2;

                return num3;
            }


        });


        // 创建元素
        Student s1 = new Student("linqingxia", 27);
        Student s2 = new Student("zhangguorong", 29);
        Student s3 = new Student("wanglihong", 23);
        Student s4 = new Student("linqingxia", 27);
        Student s5 = new Student("liushishi", 22);
        Student s6 = new Student("wuqilong", 40);
        Student s7 = new Student("fengqingy", 22);
        Student s8 = new Student("linqingxia", 29);

        // 添加元素
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);
        ts.add(s7);
        ts.add(s8);

        // 遍历
        for (Student s : ts) {
            System.out.println(s.getName() + "--" + s.getAge());
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值